작은 따옴표 안에 변수를 사용하는 방법


11

작은 따옴표로 묶은 큰 따옴표로 입력 속성을 취하는 응용 프로그램이 있습니다. 이 올바른 명령을 예로 들어 보겠습니다.

command -p 'cluster="cl1"'

자동화하기 위해 $CLUSTER변수로 bash 파일을 만들었습니다 . 내 명령은 어떻습니까? 즉, cl1 대신 무엇을 넣어야합니까?

위의 명령을 수정하면 수락되지 않습니다. 예를 들어 : command -p "cluster=cl1"허용되지 않습니다


2
CLUSTER='"cl1"'; command -p "cluster=$CLUSTER"
mikeserv

또 다른 가능성 ( 변수 cli안에 따옴표없이 저장하는 것을 선호하는 경우 CLUSTER) :CLUSTER='cl1'; command -p 'cluster="'"$CLUSTER"'"'
jimmij

마침내 정답을 찾았습니다. 감사합니다 @ jimmij.
Mohamad-Jaafar NEHME

답변:


8

명령이 명령 줄에 주어진 인수를 기반으로 환경 변수를 설정하는 것 같습니다. 당신이 할 수 있습니다 :

CLUSTER=cl1; cluster=$CLUSTER command

... 그리고 호출시 환경을 설정하십시오.

그렇지 않으면, 쉘 인용 부호는 일반적으로 인수를 구분하거나 쉘 해석에서 다른 특수 쉘 문자를 이스케이프합니다. 다양한 규칙에 따라 다른 종류의 셸 따옴표를 다른 종류에 포함 (및 이스케이프) 할 수 있습니다 .

  • "''''" -작은 따옴표로 묶인 문자열은 여러 개의 큰 따옴표를 포함 할 수 있습니다.
  • "\""- \백 슬래시는 소프트 인용 문자열 "내에서 "소프트 인용 부호를 벗어날 수 있습니다 .
    • 이와 관련하여 \\백 슬래시는 아래에 설명 된대로 자체 \$확장 토큰 및 \n줄거리를 이탈하지만 문자 그대로 처리됩니다.
  • "${expand} and then some"-소프트 따옴표로 묶인 문자열에는 해석 된 셸 $확장이 포함될 수 있습니다 .
  • '"\'-큰 '따옴표로 묶인 문자열은 '큰 따옴표 이외의 다른 문자를 포함 할 수 있습니다 .
  • \-인용 부호없는 백 슬래시는 문자를 해석하기 위해 다음 문자를 피합니다 \n.
    • A의 \\newline 케이스 양쪽 \백 슬래시와 \newline 완전히 결과 해석 명령에서 제거됩니다.
  • ${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"

1

mikeserv가 쓴 것처럼 :

 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를 참조 하십시오
.


네 말이 맞아, 고마워 그러나 자동화는 어떻습니까? CLUSTER를 읽고 싶습니까? 작은 따옴표 안에 변수
Mohamad-Jaafar NEHME

@Moi-자동화는 그다지 중요하지는 않지만 "문자 변수를 위생 처리해야하지만 첫 번째와 마지막만으로 충분합니다. 여기서 실제 문제는 앱이 arg에서 따옴표를 해석하는 것입니다. 따옴표는 인수를 구분하는 수단 일 뿐이므로 호출시 구분 기호는 \0NUL모든 경우 에 s에 의해 처리되므로 인수에서 따옴표를 해석하는 것은 좋은 생각이 아닙니다 . 아마도 원하는 정보를 앱에 전달하는 더 좋은 방법이 있습니까? 유사한 command --'script=/path/to/some/file'또는 뭔가?
mikeserv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.