Bash의 변수 확장

Bash의 변수 확장

나는 다음 명령을 시도했다

variable='one|name'
echo $variable

출력은 다음과 같습니다

one|name

대신 echo one|name오류가 발생합니다 No command 'name' found. Bash는 이를 |파이프로 취급하고 명령을 입력 name으로 one실행 하려고 하기 때문에 이는 의미가 있습니다 .

echo $variable그런데 왜 인쇄 됩니까 one|name? 매개변수와 변수가 확장된 후에는 동일해야 하지 않나요 echo one|name?

버전:

GNU bash, version 4.3.11(1)-release (i686-pc-linux-gnu)

답변1

아니, 그건 방식 때문이 아닐 거야bash 작동 명령.

를 입력하면 echo one|name명령 bash이 구문 분석되고 |파이프라인 토큰으로 처리되므로 |파이프라인이 실행됩니다.

를 입력하면 echo $variable변수 확장 전에 토큰 구문 분석이 발생하므로 명령이 및 의 bash두 부분으로 구문 분석됩니다 echo. 그 후 로 $variable확장되는 변수 확장을 수행합니다 . 이 경우 는 문자열 의 일부이며 파이프 토큰으로 간주할 수 없습니다(물론, ).$variableone|nameone|name|토큰 인식 문구완전한). 필드 분할을 수행하기 위해 구분 기호 로 사용할 수 있는 유일한 특별한 점은 IFS변수에 다음이 포함되어 있는 경우 입니다.|bash|

$ variable='one|name'
$ IFS='|'
$ echo $variable
one name

답변2

Bash그 이유는 변수가 확장되는 방식 때문입니다 .

변수를 로 확장하는 대신 one|name변수를 로 확장합니다 "one|name". 따라서 여기서는 값이 따옴표로 묶여 있으므로 명령이 아닌 문자열로 처리됩니다.

strace다음은 명령이 확장되는 방식을 보여주는 명령의 출력 입니다 .

$ variable='one|name'
$ strace echo $variable 
execve("/bin/echo", ["echo", "one|name"], [/* 33 vars */]) = 0
brk(0)                                  = 0x9cc7000

답변3

따옴표는 생성한 문자열의 일부입니다.

당신이 그렇게한다면

variable=one|name
echo $variable

결과는 예상대로일 것이다. 하지만 이 작업은 스크립트에서만 수행할 수 있습니다(유용한 설명에 감사드립니다).

관련 정보