Shell

五ARVS_五一種RvsVAR vs{VAR} 並引用或不引用

  • March 3, 2021

我可以寫

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 節,花括號是可選的。

引用自:https://unix.stackexchange.com/questions/4899