2013-08-21 145 views
1

對我來說bash腳本總是有些棘手。我有錯誤的bash字符串連接

web_dir=/tng4/users/ldiao/AQF/wrf-chem-result/ 
rm "$web_dir""three_days_ago/*.gif" 

錯誤消息是

rm: cannot remove '/tng4/users/ldiao/AQF/wrf-chem-result/three_days_ago/*.gif': 
No such file or directory 

但是,如果我改變

rm "$web_dir"three_days_ago/*.gif"" 

然後它工作。沒有拼寫錯誤。有人能爲我解釋原因嗎?謝謝!

+0

引號字符'*','?'等不在引號內擴展,但它們按字面解釋。要了解他們爲什麼這樣設計,你可能需要問一位語言開發人員。 – user000001

回答

6

的原因是,bash globbing並不裏面" "

正確的變種工作將

rm -- "$web_dir/three_days_ago/"*.gif 

而且,與RM播放時使用-i選項。這樣,如果你犯了一個錯誤或錯字,它不會刪除你的所有文件,除非你確認。

+1

準確地說,你的第二個例子的工作原理是你的'$ web_dir'正確地用雙引號括起來,後面跟着沒有引號的'three_days_ago/* .gif',接着是一個完全多餘的雙引號空字符串。對於它的價值,引用它的習慣用法就像''$ {web_dir} three_days_ago「/ *。gif' – tripleee

+0

@tripleee我總是建議在變量之間使用額外的''''''''。以防萬一你忘記用斜線結束你的變量。兩根斜線不會受傷。所以我會編輯你的例子到''「$ {web_dir}/three_days_ago」/ * .gif''。另外,如果你在報價之後或之前放置斜線,似乎沒有區別。 –

+0

對,斜槓不是shell的元字符,所以不需要引用;但另一方面,引用常規字符是無害的。 – tripleee