Bruce Barnett's UNIX Shell Quote Tutorial很棒,而Bash FAQ/pitfalls/word splitting文章有很多有用的提示。簡短的總結:
未加引用字符串可以包含大多數字符,但不是全部(如換行符),其中許多字符(包括空格)將不得不轉義。只是不要使用它們 - 如果你陷入誘惑,你可能會發現修改腳本的人在需要時忘記包含引號。
單引號字符串可以包含大部分字符,包括NUL和換行符,但不是單引號,所以他們也是有用的,只有簡單的值。
反引號是用於命令。只有當你的shell不支持$()
時才應該使用它們。例如:
current_dir=`pwd` # BAD! Don't do this!
該命令是不好的,因爲當分配的右手側不援引殼上執行它word splitting。它通常會導致難以複製的錯誤,因爲空白難以通過視覺檢查。爲了報價命令你有使用雙引號:
current_dir="$(pwd)" # OK, but loses newlines at EOF
換行符在EOF尤其棘手。您可以添加一個字符,並通過使用例如
# Works for some commands, but not pwd
current_dirx="$(pwd; echo x)"
current_dir="${current_dirx%x}"
printf %s "$current_dir"
剝離,但有一個額外的困難,因爲一些命令(如pwd
)將在其輸出端反正的末尾添加一個新行,所以你可能必須消除,以及:
# Works for some commands, including pwd
current_dirx="$(pwd; echo x)"
current_dir="${current_dirx%$'\nx'}"
printf %s "$current_dir"
雙引號可以包含任何字符(嘗試echo -ne "\0" | wc -c
),但要注意變量不能包含NULL字符。
ANSI-C quotes可以包含任意字符除了NUL(嘗試echo -ne $'\0' | wc -c
),並提供方便的轉義代碼,使其更容易與特殊字符的工作:
printf %s $'--$`!*@\a\b\E\f\r\t\v\\\'"\360\240\202\211 \n'
printf %q $'--$`!*@\a\b\E\f\r\t\v\\\'"\360\240\202\211 \n'
touch -- $'--$`!*@\a\b\E\f\r\t\v\\\'"\360\240\202\211 \n'
rm -- $'--$`!*@\a\b\E\f\r\t\v\\\'"\360\240\202\211 \n'
閱讀[手冊](http://www.gnu.org/software/bash/manual/bash.html#Quoting) – kev 2012-04-03 13:39:45
避免反引號並使用'$()'來代替...,這會刪除很多引用的考慮已經... – 0xC0000022L 2012-04-03 13:43:32