Bash 견적 확장 퍼즐

Bash 견적 확장 퍼즐

내 스크립트는 다음과 같습니다

opts="-x ''"
curl http://somepage $opts

$opts명령에 문자열을 추가하고 싶습니다 . 확장자를 확인 했는데 bash -x test.sh작은따옴표가 제거된 것을 확인했습니다.

내가 그것을 다음과 같이 바꾸면 :

opts="-x \'\'"

확장 후에는 4개의 작은따옴표가 있습니다.

답변1

정확히 무엇을 보셨나요? 스크립트로

opts="-x ''"
echo curl http://somepage $opts
opts="-x \'\'"
echo curl http://somepage $opts

bash 3.2.39 또는 4.1.5를 사용하면 알 수 있습니다.

+ opts='-x '\'''\'''
+ echo curl http://somepage -x ''\'''\'''
curl http://somepage -x ''
+ opts='-x \'\''\'\'''
+ echo curl http://somepage -x '\'\''\'\'''

curl(well, )에 대한 첫 번째 호출에는 echo curl두 문자로 구성된 마지막 인수가 있습니다 ''. 이스케이프된 특수 문자 추적: '다음과 같이 표시됩니다 '\''(작은따옴표 안에 작은따옴표를 "이스케이프"하는 일반적인 관용어). 공식적으로 ''\'''\'''는 빈 작은따옴표 문자열, ''그 뒤에 백슬래시 따옴표 문자 \', 다시 '', 다시 \', 마지막으로 구성됩니다 ''. (Ksh는 이를 약간 더 읽기 쉽게 표시합니다 $'\'\''.) 두 번째 호출에서는 4개의 문자를 전달합니다 \'\'.

일반적인 sh 구문 분석 규칙에서는 따옴표가 없는 변수를 확장하여 빈 매개변수를 생성할 수 없습니다. 단어 분할은 공백이 아닌 문자나 인용 문자가 있는 부분만 잘라냅니다.

Bash를 사용하고 있으므로 여러 옵션을 배열에 넣을 수 있습니다. 이는 ksh 및 zsh에도 적용됩니다.

opts=(-x "")
curl http://somepage "${opts[@]}"

이 특별한 경우에는 대신 환경 변수를 재정의할 수 있습니다.

http_proxy= curl http://somepage

답변2

이는 당신이 원하는 것은 리터럴 빈 문자열을 에 전달하는 것이지만 curl, 당신이 얻는 것은 이미 인용되어 있기 때문에 리터럴 따옴표 세트이기 때문입니다. 하나인용하다가리키는다른단지 함수 사용을 제안합니다.

download(){
    curl http://somepage "$@"
}
download -x ''

스크립트가 실제로 수행하는 작업을 관찰하려면 set -x먼저 스크립트를 실행해 보세요.

관련 정보