입력 특성으로 작은따옴표에 포함된 큰따옴표를 사용하는 응용 프로그램이 있습니다. 예를 들어 다음 올바른 명령을 사용하십시오.
command -p 'cluster="cl1"'
자동화하기 위해 bash 파일을 $CLUSTER
변수로 만들었습니다. 내 명령은 어떤 모습이어야 합니까? 즉, cl1 대신 무엇을 사용해야 합니까?
위의 명령을 수정하면 허용되지 않습니다. 예: command -p "cluster=cl1"
허용되지 않음
답변1
귀하의 명령이 명령줄에 제공된 매개변수를 기반으로 환경 변수를 설정하는 것 같습니다. 아마도 다음과 같이 할 수 있을 것입니다:
CLUSTER=cl1; cluster=$CLUSTER command
...그리고 호출 시 환경을 설정합니다.
그렇지 않으면 쉘 따옴표는 일반적으로 인수를 분리하거나 쉘 해석에서 다른 특수 쉘 문자를 이스케이프합니다. 당신은 포함할 수 있습니다(그래서 탈출)다양한 규칙에 따라 다른 유형의 다양한 쉘 인용문:
"''''"
- 소프트 따옴표로 묶인 문자열에는 하드 따옴표가 여러 개 포함될 수 있습니다."\""
- 백슬래시는\
소프트 참조 문자열"
내에서 소프트 참조를 이스케이프할 수 있습니다."
- 이 경우
\\
백슬래시도 아래 설명된 대로 자체적으로 이스케이프되고\$
확장 태그 및\n
줄 줄이기는 하지만 문자 그대로 처리됩니다.
- 이 경우
"${expand} and then some"
- 소프트 참조 문자열에는 해석된 셸$
확장이 포함될 수 있습니다.'"\'
-하드 쿼트 문자열에는 하드 따옴표를'
제외한 모든 문자가 포함될 수 있습니다.'
\
- 인용되지 않은 백슬래시는 리터럴 해석을 위해 후속 문자(다른 백슬래시라도)를 이스케이프합니다(\n
ewline 제외).- ewline 의
\\n
경우 생성된 해석 명령에서\
백슬래시와 ewline이 모두 완전히 제거됩니다.\n
- ewline 의
${parameter+expand "$parameter"}
- 몇 가지 특수한 경우를 제외하고 쉘 확장으로 생성된 따옴표는 구분 기호로 거의 사용되지 않습니다. 여기서는 이에 대해 더 이상 설명하지 않겠습니다.
제 생각에는 모든 응용 프로그램이 명령줄 인수에 있는 따옴표를 해석한다는 것이 이상하다고 생각합니다. 이것은 별로 의미가 없습니다 - 적어도 쉘에는 - 인용의 주요 목적은 일반적으로 인수를 구분하는 것입니다. 그러나 호출되면 인수는 항상경계가 그려졌습니다문자가 포함되어 있으므로 \0NUL
인용은 별로 효과가 없습니다.
쉘조차도 스위치를 사용하여 호출할 때 일반적으로 호출 매개변수 중 하나의 따옴표만 해석합니다 -c
.피연산자실제로 호출될 때 실행되어야 하는 쉘 스크립트입니다. 이것은 사건이다두 가지 평가입력하다.
그럼에도 불구하고 명령줄의 인수를 통해 리터럴 인용문을 전달하기 위해 할 수 있는 일이 많이 있습니다. 예를 들어:
CLUSTER='"cl1"'; command -p "cluster=$CLUSTER"
이전에 댓글에서 지적했듯이 "
자체적으로 quoted 된 확장 내에 따옴표를 포함 할 수 있습니다 "
.
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
a의 구분 기호를 인용하지 않으면 <<here-document
거의 모든 내용이 "
소프트 참조로 처리됩니다.와는 별개로큰 "
따옴표 자체는 특별히 처리되지 않습니다. 따라서 위의 코드를 실행하면 cat
:
CLUSTER=cl1
cat <<-SCRIPT
cluster="$CLUSTER"
SCRIPT
...인쇄됩니다...
cluster="cl1"
답변2
좋다맥사이프썼다:
CLUSTER='"cl1"'; command -p "cluster=$CLUSTER"
공백/메타 문자를 포함하는 모든 리터럴은 "큰따옴표"로 처리합니다.모든확장: "$var"
, "$(command "$var")"
, "${array[@]}"
, "a & b"
. 'single quotes'
코드나 텍스트 $'s: 'Costs $5 US'
에 대해서는 ssh host 'echo "$HOSTNAME"'
을 참조하십시오.
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words