명령이 명령 줄에 주어진 인수를 기반으로 환경 변수를 설정하는 것 같습니다. 당신이 할 수 있습니다 :
CLUSTER=cl1; cluster=$CLUSTER command
... 그리고 호출시 환경을 설정하십시오.
그렇지 않으면, 쉘 인용 부호는 일반적으로 인수를 구분하거나 쉘 해석에서 다른 특수 쉘 문자를 이스케이프합니다. 다양한 규칙에 따라 다른 종류의 셸 따옴표를 다른 종류에 포함 (및 이스케이프) 할 수 있습니다 .
"''''"
-작은 따옴표로 묶인 문자열은 여러 개의 큰 따옴표를 포함 할 수 있습니다.
"\""
- \
백 슬래시는 소프트 인용 문자열 "
내에서 "
소프트 인용 부호를 벗어날 수 있습니다 .
- 이와 관련하여
\\
백 슬래시는 아래에 설명 된대로 자체 \$
확장 토큰 및 \n
줄거리를 이탈하지만 문자 그대로 처리됩니다.
"${expand} and then some"
-소프트 따옴표로 묶인 문자열에는 해석 된 셸 $
확장이 포함될 수 있습니다 .
'"\'
-큰 '
따옴표로 묶인 문자열은 '
큰 따옴표 이외의 다른 문자를 포함 할 수 있습니다 .
\
-인용 부호없는 백 슬래시는 문자를 해석하기 위해 다음 문자를 피합니다 \n
.
- A의
\\n
ewline 케이스 양쪽 \
백 슬래시와 \n
ewline 완전히 결과 해석 명령에서 제거됩니다.
${parameter+expand "$parameter"}
쉘 확장으로 인한 따옴표는 특별한 경우를 제외하고는 거의 구분 기호로 사용되지 않습니다. 나는 이것들을 더 자세히 설명하지 않을 것이다.
모든 응용 프로그램이 명령 줄 인수에서 따옴표를 해석하는 것이 이상하다고 생각합니다. 이러한 관행은 쉘의 경우 적어도 인용의 주요 목적이 일반적으로 인수를 구분하는 것이므로 많은 의미가 없습니다. 그러나 호출시 인수는 항상 문자 로 구분\0NUL
되므로 따옴표는 많은 목적을 제공 할 수 없습니다.
쉘조차도 -c
스위치로 호출 될 때 호출 인수 중 하나에서 따옴표를 해석하기 만하면됩니다. 이는 첫 번째 피연산자 가 실제로 호출시 실행되어야하는 쉘 스크립트임을 나타냅니다 . 입력 이 두 번 평가 된 경우입니다 .
그러나 명령 줄에서 인수를 통해 리터럴 따옴표를 전달하기 위해 여러 가지 작업을 수행 할 수 있습니다. 예를 들면 다음과 같습니다.
CLUSTER='"cl1"'; command -p "cluster=$CLUSTER"
앞에서 언급했듯이 "
인용 된 확장 내에 따옴표를 포함 할 수 있습니다 "
.
CLUSTER=cl1; command -p "cluster=\"$CLUSTER\""
인용 된 문자열 내에서 백 슬래시를 "
사용하여 이스케이프 처리 할 수 있습니다 .\
"
CLUSTER=cl1; command -p cluster='"'"$CLUSTER"'"'
인용 스타일을 교대로 연결하여 위의 @jimmij 메모와 같이 원하는 최종 결과를 얻을 수 있습니다 .
CLUSTER=cl1; ( set -f; IFS=; command -p cluster=\"$CLUSTER\" )
파일 이름 생성 과 $IFS
분할을 모두 비활성화 하여 인용 할 필요가 $expansion
없으며 인용 부호 만 인용 할 수 있습니다. 이것은 아마도 과잉 일 것입니다.
마지막으로 사용될 수있는 다른 유형의 쉘 인용이 있습니다. 앞에서 언급했듯이 sh -c "$scriptlet"
셸 호출 형식은 종종 명령 줄에 셸 스크립트를 제공하는 데 사용됩니다. 때 $scriptlet
와 같은 따옴표 다른 따옴표를 포함해야하는 경우로 - -하지만 복잡해진다는 종종 여기-문서와 사용하는 것이 유리할 수있다 sh -s
쉘이 구체적으로 다음의 모든 할당 지시 - 대신 피연산자를 그것에서하는 것처럼 위치 매개 변수에 -c
케이스를 아직 스크립트를 가져 오지 못했습니다 stdin
.
명령이 이런 방식으로 따옴표를 해석 해야하는 경우 파일 입력에서 따옴표를 해석하는 것이 좋습니다. 예를 들면 다음과 같습니다.
CLUSTER=cl1
command --stdin <<-SCRIPT
cluster="$CLUSTER"
SCRIPT
당신은의 구분 인용하지 않는 경우 <<here-document
가 있었다처럼 그 내용이 거의 정확하게 처리하는 모든의 다음 "
- 소프트 인용 제외하고는 그 "
자체가 특별하게 취급되지 않는다 따옴표를. 그리고 cat
대신 위와 같이 실행하면 :
CLUSTER=cl1
cat <<-SCRIPT
cluster="$CLUSTER"
SCRIPT
... 인쇄 ...
cluster="cl1"
CLUSTER='"cl1"'; command -p "cluster=$CLUSTER"