나한테 전화가 있어
./run.sh name --vars="service_name='someothername'"
--vars="service_name='someothername'"
정확히 동일한 매개변수를 사용하여 다른 프로그램을 호출하려고 하는데 run.sh
, $2
이 작업을 수행할 때마다 Bash는 변수 주위에 작은따옴표를 넣습니다.
cmd=$(runother $2 | process output)
나 이거 하나 갖고 있어
runother '"--vars=service_name='\''someother..
runother '--vars=service_name='\''someother
runother '--vars=service_name=someother'
나는 그 주위에 큰 따옴표를 넣고 문자열을 인쇄하는 것과 같이 작은 따옴표를 제거하려고 시도했습니다 $2
sub-bash .${2//\'}
printf
UPD:분명히 프로그램은 비슷한 문제를 고려하므로 ./a --b=c
이 ./a '--b=c'
질문은 의미가 없으며 다른 코드에서 오류가 발생합니다.
UPD2: @choroba가 아래 주석에서 언급했듯이: " set -x
단어 분할이 어떻게 작동하는지 확인할 수 있도록 출력에 따옴표를 추가하세요.실제로 문자열에 추가되지는 않습니다., 하지만"
답변1
큰따옴표 $2
(값이 있는 경우)가 올바른 접근 방식입니다.
출력을 보고 있다면 set -x
쉘이 출력에 다양한 인용문을 추가할 가능성이 있다는 점에 유의하십시오. 이러한 추가 인용문은 데이터의 일부가 아닙니다.
예(중간 bash
):
var=--vars="service_name='someothername'"
printf 'var has value %s\n' "$var"
이것은 출력됩니다
var has value --vars=service_name='someothername'
하지만 set -x
출력은 다음과 같습니다
$ set -x
$ var=--vars="service_name='someothername'"
+ var='--vars=service_name='\''someothername'\'''
$ printf 'var has value %s\n' "$var"
+ printf 'var has value %s\n' '--vars=service_name='\''someothername'\'''
var has value --vars=service_name='someothername'
pdksh
OpenBSD 에서 :
$ set -x
$ var=--vars="service_name='someothername'"
+ var=--vars=service_name='someothername'
$ printf 'var has value %s\n' "$var"
+ printf var has value %s\n --vars=service_name='someothername'
var has value --vars=service_name='someothername'
존재하다 zsh
:
$ set -x
$ var=--vars="service_name='someothername'"
+zsh:10> var='--vars=service_name='\''someothername'\'
$ printf 'var has value %s\n' "$var"
+zsh:11> printf 'var has value %s\n' '--vars=service_name='\''someothername'\'
var has value --vars=service_name='someothername'
디버그 출력의 추가 참조에 대해 걱정하지 마십시오. 변수를 큰따옴표와 함께 사용하세요.
답변2
다음과 같이 내부 따옴표를 이스케이프 처리하면서 따옴표로 묶인 매개변수 앞에 $ 기호를 배치해야 합니다.
./run.sh name $'--vars="service_name=\'\someothername\'"'
$는 문자열의 내용을 해석하지 않도록 문자열로 처리하도록 쉘에 지시하기 때문에 작동합니다. 그리고 문자열의 닫는 따옴표로 처리되지 않도록 따옴표를 이스케이프해야 합니다.
(당신은 또한 볼 수 있습니다이 게시물)