매개변수 확장

매개변수 확장

저는 매개변수 확장을 가지고 놀았습니다. 아래는 내 코드입니다.

a="one"
sh -c 'echo $a'

b="two"
sh -c "echo $b"

c="three" sh -c 'echo $c'
echo $c

이 스크립트를 실행할 때의 출력은 다음과 같습니다.

$sh test.sh

two
three

$

$a의 경우 작은따옴표는 대체를 억제합니다. 그냥 echo $a 를 출력하면 안되나요? 새 줄을 인쇄하고 있는데, 이는 $a 값이 비어 있다는 뜻인가요? $c의 경우 "echo $c"가 작동하지 않고 새 줄이 인쇄되지 않지만 다음 줄의 echo $c는 예상대로 작동합니다. 이것이 어떻게 작동하는지 조금 혼란 스럽습니다.

답변1

sh -c 'echo $a'이는 새 셸을 열고 echo $a입력하는 것과 같습니다. 하위 셸에는 변수가 없으므로 a(상위 셸에서 변수를 설정하지 않았음 export) 빈 줄이 인쇄됩니다.

그리고

b="two"
sh -c "echo $b"

, "echo $b"문자열은 현재 쉘에 의해 확장되고 확장된 값은 매개변수 문자열로 하위 쉘에 전달됩니다. 마치 새 쉘을 열고 echo two.

var=val command임시로 설정하고 exports를 var=val호출하면 됩니다 command.

c="three" sh -c 'echo $c'

거의 (하위 쉘은 실제로 존재하지 않습니다)

( export c="three"; sh -c 'echo $c' )

상위 쉘의 c 변수는 영향을 받지 않습니다.

답변2

하위 프로세스의 변수를 보려면 export해당 변수를 확인해야 합니다. 이와 같이:

   $ export a=7
   $ sh -c 'echo $a'
   7

귀하의 경우 하위 프로세스( ab)는 상위 셸의 변수를 볼 수 없습니다.

작은따옴표를 사용하여 문자열을 생성하면 어떤 대체도 작동하지 않습니다. 변수나 그와 유사한 것은 대체할 수 없습니다 \n. 그것은 정확히 $a또는 가 될 것입니다 \n. 따라서 첫 번째 경우의 문자열은 정확히 "echo $a"입니다. sh -c 'echo $a'만들 것이다새로운프로세스이며 프로세스에는 상위 프로세스가 없으며 빈 문자열인 $a자체 uninitialized 가 있습니다 . $a그것은 단지 실행될 것입니다'echo $a'

두 번째 경우에는 큰따옴표를 사용합니다. 교체가 작동하고 문자열은 다음과 같습니다."echo two" 앞으로자식 프로세스를 실행합니다. 그래서, 그것은 단지 실행입니다 sh -c 'echo two'.

세 번째 경우에는 $c내보낸 변수가 됩니다. 이는 "이 명령에 대해서만 변수 내보내기"를 의미하는 특수 구문입니다. 따라서 정확하게 실행하면 새 쉘이 환경 변수로 sh -c 'echo $c'포함됩니다 . 또는 쉘을 시작할 때 와 $c같습니다 .$PATH$HOME

관련 정보