당신의 쉘은 따옴표에 도달하기 전에 '
와를 모두 해석합니다 . 필자는 일반적으로 불필요하더라도 반박 할 인용 부호를 큰 따옴표로 묶습니다. 예를 들면 다음과 같습니다."
echo
$ echo "Hello world"
Hello world
따라서 첫 번째 예에서 출력에 리터럴 따옴표를 포함하려면 이스케이프 처리해야합니다.
$ echo \'Hello world\'
'Hello world'
또는 이미 인용 된 인수 내에서 사용해야합니다 (그러나 동일한 종류의 인용 부호가 아니거나 어쨌든 탈출해야합니다).
$ echo "'Hello world'"
'Hello world'
$ echo '"Hello world"'
"Hello world"
두 번째 예에서는 문자열 중간에 명령 대체를 실행하고 있습니다.
grep $ARG /var/tmp/setfile | awk {print $2}
로 시작하는 $
것은 또한 쉘에 의해 특별히 처리됩니다-변수로 취급하고 값으로 대체합니다. 이러한 변수 중 어느 것도 쉘에 설정되어 있지 않기 때문에 실제로는 실제로 실행됩니다.
grep /var/tmp/setfile | awk {print}
grep
하나의 인수 만 보이 므로 인수는 찾고있는 패턴이고 데이터를 읽어야하는 장소는 stdin이라고 가정하므로 입력 대기를 차단합니다. 그래서 두 번째 명령이 중단되는 것처럼 보입니다.
인수를 작은 따옴표로 묶는 경우 (이것은 첫 번째 예제가 거의 효과가 있었던 경우) 발생하지 않으므로 원하는 출력을 얻는 한 가지 방법입니다.
echo \'' echo PARAM=` grep $ARG /var/tmp/setfile | awk '{print $2}' ` '\'
또한 큰 따옴표를 사용할 수 있지만 $
셸 을 이스케이프 처리 하여 쉘이 변수로 해석하지 못하도록하고 백틱을 지정하면 셸에서 명령 대체를 즉시 실행하지 않습니다.
echo "' echo PARAM=\` grep \$ARG /var/tmp/setfile | awk '{print \$2}' \` '"