나는 다음 명령을 시도했다
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
결과는 예상대로일 것이다. 하지만 이 작업은 스크립트에서만 수행할 수 있습니다(유용한 설명에 감사드립니다).