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그 후 변수 확장을 수행 $variable하여 one|name. 이 경우 one|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

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

관련 정보