赋值变量时如何使用双引号?
How to use double quotes when assigning variables?
有一个 bash 文件,内容如下:
FOO=${BAR:-"/some/path/with/$VAR/in/it"}
那些双引号是必要的吗?根据以下测试,我会说不,并且在上述作业中根本不需要引用。事实上,它是该变量的用户需要在双引号内展开它以避免错误拆分。
touch 'some file' # create a file
VAR='some file' # create a variable for that file name
FOO=${BAR:-$VAR} # use it with the syntax above, but no quotes
ls -l "$FOO" # the file does exist (here we do need double quotes)
ls -l $FOO # without quotes it fails searching for files `some` and `file`
rm 'some file' # remove temporary file
我说的对吗?或者还有更多?
Are those double quotes necessary?
不是这种情况,不是。
Am I correct?
是的。而且它是总是必须引用它的变量的用户 - 扩展变量时字段拆分是运行,所以在使用时它必须被引用。
也有例外,例如 case $var in
和 somevar1=$somevar2
- 不进行 运行 字段拆分的上下文,因此不需要引用。但无论如何,引号在这种情况下并没有什么坏处,无论如何都可以使用。
Or there's something more?
来自POSIX shell:
2.6.2 Parameter Expansion
In addition, a parameter expansion can be modified by using one of the following formats. In each case that a value of word is needed (based on the state of parameter, as described below), word shall be subjected to tilde expansion, parameter expansion, command substitution, and arithmetic expansion.
${parameter:-word}
因为 field splitting expansion 在 ${parameter:-word}
中并不 运行 超过 word
,确实,引用并没有多大作用。
有一个 bash 文件,内容如下:
FOO=${BAR:-"/some/path/with/$VAR/in/it"}
那些双引号是必要的吗?根据以下测试,我会说不,并且在上述作业中根本不需要引用。事实上,它是该变量的用户需要在双引号内展开它以避免错误拆分。
touch 'some file' # create a file
VAR='some file' # create a variable for that file name
FOO=${BAR:-$VAR} # use it with the syntax above, but no quotes
ls -l "$FOO" # the file does exist (here we do need double quotes)
ls -l $FOO # without quotes it fails searching for files `some` and `file`
rm 'some file' # remove temporary file
我说的对吗?或者还有更多?
Are those double quotes necessary?
不是这种情况,不是。
Am I correct?
是的。而且它是总是必须引用它的变量的用户 - 扩展变量时字段拆分是运行,所以在使用时它必须被引用。
也有例外,例如 case $var in
和 somevar1=$somevar2
- 不进行 运行 字段拆分的上下文,因此不需要引用。但无论如何,引号在这种情况下并没有什么坏处,无论如何都可以使用。
Or there's something more?
来自POSIX shell:
2.6.2 Parameter Expansion
In addition, a parameter expansion can be modified by using one of the following formats. In each case that a value of word is needed (based on the state of parameter, as described below), word shall be subjected to tilde expansion, parameter expansion, command substitution, and arithmetic expansion.
${parameter:-word}
因为 field splitting expansion 在 ${parameter:-word}
中并不 运行 超过 word
,确实,引用并没有多大作用。