Shell
五ARVS_五一種RvsVAR vs{VAR} 並引用或不引用
我可以寫
VAR=$VAR1 VAR=${VAR1} VAR="$VAR1" VAR="${VAR1}"
對我來說,最終結果似乎都差不多。我為什麼要寫一個或另一個?這些中的任何一個都不是攜帶式/POSIX嗎?
VAR=$VAR1
是 的簡化版本VAR=${VAR1}
。第二個可以做第一個不能做的事情,例如引用數組索引(不可移植)或刪除子字元串(POSIX-portable)。請參閱POSIX 規範中Bash Guide for Beginners and Parameter Expansion的更多變數部分。在變數周圍使用引號,如
rm -- "$VAR1"
orrm -- "${VAR}"
是一個好主意。這使得變數的內容成為一個原子單位。如果變數值包含空格(好吧,$IFS
特殊變數中的字元,預設情況下為空格)或萬用字元並且您沒有引用它,那麼每個單詞都會被考慮用於文件名生成(萬用字元),其擴展會為您提供盡可能多的參數正在做。$ find . . ./*r* ./-rf ./another ./filename ./spaced filename ./another spaced filename ./another spaced filename/x $ var='spaced filename' # usually, 'spaced filename' would come from the output of some command and you weren't expecting it $ rm $var rm: cannot remove 'spaced': No such file or directory # oops! I just ran 'rm spaced filename' $ var='*r*' $ rm $var # expands to: 'rm' '-rf' '*r*' 'another spaced filename' $ find . . ./another ./spaced filename ./another spaced filename $ var='another spaced filename' $ rm -- "$var" $ find . . ./another ./spaced filename
關於可移植性:根據POSIX.1-2008 第 2.6.2 節,花括號是可選的。