-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 "+")

(세 번째 줄은 정의되지 않은 변수 이름이므로 2로 x=2+hello설정되어 있으며 , 설정되지 않은 변수는 기본적으로 0으로 해석됩니다.)xhello

더 많은 예시

  • declare -l var명령문에는 var소문자만 포함되어야 합니다. 쉘은 변수 값을 저장할 때 모든 대문자를 소문자로 변환합니다.
  • 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- 배열과 연관되는 이름 만들기(지원되는 경우)

내가 아는 한, 먼저 선언하지 않고 연관 배열을 설정하려고 하면 인덱스 배열이 생성되기 때문에 이는 전적으로 필요합니다.

$ 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- 이름에 "정수" 속성을 갖도록 설정

매개변수가 가능한지 확인하려는 경우 유용합니다.오직정수를 저장합니다. 또한 할당에 대한 산술 확장을 수행할 수도 있습니다.

$ 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- 이름을 읽기 전용으로 설정

이것은 훌륭한 기능입니다. 한 번 설정하고 변경하지 않으려는 셸/환경 변수에 특히 유용합니다.

$ 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- 이름 내보내기

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


관련 정보