내 스크립트는 다음과 같습니다
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