쉘 스크립트에서 변수 할당의 공백 변수 할당의 차이점은

아래 변수 할당의 차이점은 무엇입니까?

var=23
var =23
var= 23
var = 23

대입 연산자 주위의 공간에 차이가 있습니까?



답변

그것은 껍질에 달려 있습니다. 우리가 4 가지 주요 쉘 패밀리 (Bourne, csh, rc, fish) 만 본다면 :

본 가족

즉, Bourne 쉘 및 모든 변종이며 ksh, bash, ash/ dash, zsh, yash.

  • var=23: 그것은 올바른 변수 할당 구문입니다 : 따옴표가없는 문자, 숫자 또는 밑줄로 구성 =되고 명령 인수 앞에 나타나는 따옴표 가 붙은 단어 (여기서 자체)
  • var =23var와 명령 =23(제외 등 인수 zsh=something의 경로로 확장하는 특별한 연산자 something로 명령을 입력합니다. 여기에서, 당신은 가능성이 오류가 발생하는 것 23유효한 명령 이름이 될 가능성이있다).
  • var= 23: var=명령 이름 뒤에 오는 지정 23. 그것은 환경 ( 빈 값을 가진 환경 변수)으로 전달 되어 실행 23됩니다 .var=var
  • var = 23, 및 var명령을 인수로 사용하십시오. 예를 들어 보십시오 .=23echo = 23

Csh 가족

csh그리고 tcsh. 변수 할당에는 set var = value스칼라 변수, set var = (a b)배열, setenv var value환경 변수, @ var=1+1할당 및 산술 평가 구문 이 있습니다 .

그래서:

  • var=23바로 호출하는 var=23명령을 사용합니다.
  • var =23인수로 var명령을 호출합니다 =23.
  • var= 23인수로 var=명령을 호출합니다.23
  • var = 23인수 var와 함께 =23인수로 명령을 호출합니다 .

Rc 가족

그건 rc, es하고 akanga. 이러한 껍질, 배열 변수이며 할당으로되어 var = (foo bar)함께 var = foo짧게되고 var = (foo)(하나 개와 배열 foo요소)와 var =위한 짧은 var = ()(NO 요소 어레이를 사용 var = ''하나 개 빈 요소 어레이의 경우).

어쨌든 빈칸 (공백 또는 탭) =은 허용되며 선택 사항입니다. 따라서이 쉘에서이 4 개의 명령은 var = (23)하나의 요소가있는 배열을 할당하는 것과 동일하며 동등합니다 23.

물고기

에서 fish, 변수 할당 구문입니다 set var value1 value2. 에서처럼 rc변수는 배열입니다.

따라서 동작은 이름 과 함께 명령을 실행할 수 없다는 csh점을 제외하고는와 동일합니다 . 이러한 명령이 있으면 예 를 들어 다음을 통해 호출해야합니다 ..fish=shsh -c 'exec weird===cmd'

모든 그래서 var=23하고 var= 23당신에게 오류를 제공합니다 var =23부르는 것 var으로 명령을 =23인수로하고 var = 23부르는 것 var와 명령 =23인수로.


답변

var=23변수에 23을 할당합니다 var.

var =23var인수와 함께 명령 (또는 별명 또는 함수)을 실행하려고합니다.=23

var = 23그러나 논쟁 =23

var= 23세트 var빈 문자열로 환경 변수는 다음 명령을 실행23

예, 쉘은 프로그래밍 언어로 이상합니다. 그러나 공백은 명령과 인수를 구분하는 대화식 사용 을위한 쉘로 완벽하게 이해됩니다 . 대부분의 “특수 문자”( =이 경우)는 명령에 대한 거의 임의의 인수를 허용하기 위해 특정 위치에서만 특별한 의미를 갖습니다. 위의 해석을 참조하십시오.


답변

  • var=23 변수에 값을 할당하기위한 올바른 구문입니다.
  • var =23명령 var에 대한 =23옵션 / 인수가있는 명령 으로 간주됩니다 var(인수 / 옵션에 대한 올바른 / 표준 구문은 -option또는 --option)
  • var= 23var공백은 할당 프로세스를 중단하고 23다른 명령으로 간주되므로 아무것도 할당하지 않습니다 . 해결 방법은 공백을 저장 var=\ 23하거나 var=' 23'저장하는 것입니다.
  • var = 23번째 경우 에서 설명한 것과 비슷한 효과가 있습니다.

    실제로 이러한 유형의 공간 사용 =은 일반적으로 내부의 테스트 조건에서 사용됩니다 [[ ]]. 배쉬 예제 :

    string1 = string2
           True if the strings are equal.  = should be used with the test command  for  POSIX  conformance.
           When used with the [[ command, this performs pattern matching as described above (Compound Commands).

그리고 공백의 동작은 =쉘과 프로그래밍 언어에 달려 있습니다.