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


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.