-a- NAME을 인덱스 배열로 만들기 위해(지원되는 경우)

-a- NAME을 인덱스 배열로 만들기 위해(지원되는 경우)

나는 "변수 속성"의 일반적인 개념을 이해하는 데 도움이 되기를 바랍니다.Bash에서 선언되는 내용.

변수 속성이란 무엇입니까? 누군가 변수에 속성을 부여하려는 이유는 무엇입니까? 변수를 사용하여 작업할 때 변수를 생성하고 실행 시 확장하는 것만으로는 "충분"하지 않은 이유는 무엇입니까?

답변1

일반적으로 변수는 값을 저장하는 장소입니다. 변수( var="some value")에 값을 할당한 후 변수 확장을 통해 값을 불러올 수 있습니다(쓰기 "$var"는 쓰기와 동일 "some value").

변수에 값을 할당하거나 쉘이 변수에 액세스하는 다른 상황에서 특별한 작업을 수행하는 변수를 만드는 것이 가능합니다. 변수의 속성은 쉘이 변수의 이름과 값 옆에 저장하는 주석으로, 쉘에 이 특별한 동작을 적용하라고 지시합니다.

한 가지 예

declare -i xx정수 값만 포함해야 함 을 쉘에 알려줍니다 . 일반적으로 변수에 값을 할당하면 쉘은 등호 오른쪽을 확장한 결과 문자열을 가져와 변수 값으로 저장합니다. 그러나 변수에 정수 속성이 있으면 쉘은 해당 문자열을 산술 표현식으로 구문 분석하고 해당 표현식을 평가한 결과를 저장합니다. 예를 들어:

$ x=2+2; echo $x
2+2
$ declare -i x; x=2+2; echo $x
4
$ declare -i x; x=2+hello; echo $x
2
$ declare -i x; x=2+
bash: 2+: syntax error: operand expected (error token is "+")

x=2+hello( 설정이 x2 인 세 번째 줄은 hello정의되지 않은 변수 이름이고 설정되지 않은 변수는 기본적으로 자동으로 0으로 해석됩니다.)

더 많은 예

  • declare -l varvar소문자만 포함해야 한다고 선언합니다 . 쉘은 변수 값을 저장할 때 모든 대문자를 소문자로 변환합니다.
  • declare -u var다른 방향으로 변환을 수행합니다.
  • declare -r varvar읽기 전용으로 만드는 것은 할당의 특별한 동작이기도 합니다. 이는 모든 후속 할당이 var실패하게 만듭니다.
  • declare -x varvar환경으로 수출되는 원인이 됩니다 . 이 속성의 경우 bash가 외부 명령을 실행할 때 특별한 동작이 발생합니다. 외부 명령은 쉘이 외부 명령을 실행할 때 쉘이 내보내는 변수가 포함된 환경을 확인합니다.

답변2

에서 help declare:

Options which set attributes:
    -a  to make NAMEs indexed arrays (if supported)
    -A  to make NAMEs associative arrays (if supported)
    -i  to make NAMEs have the `integer' attribute
    -l  to convert the value of each NAME to lower case on assignment
    -n  make NAME a reference to the variable named by its value
    -r  to make NAMEs readonly
    -t  to make NAMEs have the `trace' attribute
    -u  to convert the value of each NAME to upper case on assignment
    -x  to make NAMEs export

참고: declare기능에도 사용할 수 있습니다.

이러한 각 속성에는 하나 이상의 용도가 있습니다.


-a- NAME을 인덱스 배열로 만들기 위해(지원되는 경우)

매개변수를 배열로 설정하면 자동으로 인덱스 배열로 선언되기 때문에 이것이 꼭 필요한 것은 아닙니다. 이를 사용하면 코드가 더 명확하고 읽기 쉬워질 수 있습니다.


-A- NAME 연관 배열 만들기(지원되는 경우)

AFAIK 이는 먼저 선언하지 않고 연관 배열을 설정하려고 시도하면 인덱스 배열이 생성되므로 전적으로 필요합니다.

$ assoc=([foo]=bar)
$ declare -p assoc
declare -a assoc=([0]="bar")
$ unset assoc
$ declare -A assoc
$ assoc=([foo]=bar)
$ declare -p assoc
declare -A assoc=([foo]="bar" )

-i- NAME에 '정수' 속성을 갖게 하려면

매개변수가 다음과 같은지 확인하려는 경우 유용합니다.오직정수를 보유합니다. 이를 통해 할당 시 산술 확장을 수행할 수도 있습니다.

$ declare -i a
$ a=foo
$ echo $a
0
$ a=1+1
$ echo $a
2

-l- 할당 시 각 NAME의 값을 소문자로 변환합니다.

매개변수 값이 항상 모두 소문자인지 확인합니다. 이것은 제가 몰랐던 매우 멋진 기능이며 아마도 앞으로 사용할 것입니다. 복잡한 매개변수 확장이나 다음과 같은 별도의 유틸리티를 사용할 필요가 없습니다.tr

$ declare -l foo=Bar
$ echo $foo
bar

-n- NAME을 해당 값으로 명명된 변수에 대한 참조로 만듭니다.

간접 참조와 같습니다. 이렇게 하면 eval많은 스크립트에서 의 사용이 제거될 수 있습니다 .

$ a=foo
$ declare -n b=a
$ echo $b
foo

-r- NAME을 읽기 전용으로 만들려면

이것은 좋은 기능입니다. 한 번 설정하고 변경되지 않도록 하고 싶은 쉘/환경 변수에 특히 유용할 수 있습니다.

$ declare -r foo=bar
$ echo $foo
bar
$ foo=baz
-bash: foo: readonly variable

-t- NAME에 `trace' 속성을 갖게 하려면

나는 이것에 대해 확신이 없습니다. 기능에만 적용될 수 있다고 생각합니다.


-u- 할당 시 각 NAME의 값을 대문자로 변환합니다.

비슷 -l하지만 정반대

$ declare -u foo=bAr
$ echo $foo
BAR

-x- NAME을 내보내려면

변수를 환경으로 내보내는 또 다른 방법입니다.


관련 정보