2017-08-30 86 views
1

以下是空腳本替換爲單引號的腳本。如果變量不爲空,那麼我們有正確的替代。bash空變量命令替換導致單引號

$ set -x; aa=""; bb=`curl "$aa" -vvv`; set +x 
+ aa= 
++ curl '' -vvv 

的事情要注意的是在地方空變量的單引號。

當變量不是空的,一切工作正常,如:

$ set -x; aa="google.com"; bb=`curl "$aa" -vvv`; set +x 
+ aa=google.com 
++ curl google.com -vvv 

Q1:爲什麼是空的變量或導致單引號空間中的變量引入? Q2:如何防止單引號代替空變量?

現在,我可以刪除雙引號,一切正常,但我需要保留空格,如果有的話。

謝謝。

回答

3

單引號不被介紹,他們只是用來告訴你,你是通過一個空的論點。您使用的雙引號引起空參數傳遞。如果你不想要的說法,但要允許在變量的空白,你必須做一些事情,如:

curl ${aa:+"$aa"} -vvv 

這是不同於curl ${aa+"$aa"} -vvv當aa是空字符串,但是從你的描述似乎你想要前者。

+0

謝謝。爲什麼curl會用一個實際的論證來解釋一個空的論證或空間?它不應該忽略它嗎?這是一個捲曲問題還是shell問題? – Khanna111

+1

如果您將空字符串作爲參數傳遞,那麼這就是傳遞的參數。爲什麼要捲曲忽略它?這既不是殼問題,也不是捲毛問題;這是一個使用錯誤。您正在傳遞curl一個空參數,並且curl(IMO正確)不會以特殊方式處理該參數,但會嘗試將空字符串用作url。 –

1

由於您在$aa附近使用了雙引號,因此您會看到單引號,因此curl會將空字符串視爲您的參數。如果您放棄這樣的雙引號,則不會得到此效果:

set -x; aa=""; bb=`curl $aa -vvv`; set +x 
+2

請注意,將雙引號關閉也意味着變量的值將受到分詞和通配符擴展的影響,這可能會導致意外的行爲。 –

0

這是因爲您已將變量替換括入雙引號。 $aa展開爲空字符串,該字符串放置在引號中,因此不生成任何引號。在這種情況下,curl將按順序看到3個參數:curl,<empty string>,-vvv

如果去掉雙引號輪$aa,第二個參數將不會被傳遞到curl,並且它只能看到curl-vvvargv參數,它的主要功能:

$ set -x; aa=""; bb=`curl $aa -vvv`; set +x 
+ aa= 
++ curl -vvv