何时在shell变量中引用引号?
有人能告诉我是否应该在shell脚本中将引号包含在变量中吗?
例如,以下是正确的:
xdg-open $URL
[ $? -eq 2 ]
要么
xdg-open "$URL"
[ "$?" -eq "2" ]
如果是这样,为什么?
一般规则:如果它可以是空的或包含空格(或任何空格)或特殊字符(通配符),则引用它。 不用空格引用字符串通常会导致shell将单个参数拆分为许多。
$?
不需要引号,因为它是一个数字值。 $URL
是否需要它取决于您允许的内容以及是否仍然需要参数(如果它为空)。
由于这种方式更安全,我倾向于总是引用字符串。
一般来说,这里是一个三点的引用公式:
双引号
在我们想要抑制分词和通配的环境中。 在上下文中,我们希望文字被视为字符串,而不是正则表达式。
单引号
在字符串文字中,我们想要抑制反斜线的插值和特殊处理。 换句话说,使用双引号的情况是不合适的。
没有引号
在我们绝对确信没有任何分词或通配问题的情况下,或者我们希望分词和匹配。
例子
双引号
"StackOverflow rocks!"
, "Steve's Apple"
) "$var"
, "${arr[@]}"
) "$(ls)"
, "`ls`"
) "/my dir/"*
) "single'quote'delimited'string"
) "${filename##*/}"
) 单引号
'Really costs $$!'
, 'just a backslash followed by at: t'
) 'The "crux"'
) $'nt'
) $'{"table": "users", "where": "first_name"='Steve'}'
) 没有引号
$$
, $?
, $#
等) ((count++))
, "${arr[idx]}"
, "${string:start:length}"
等算术语境中 [[ ]]
表达式内部,不存在分词和通配问题(这是一个风格和意见可能差异很大的问题) for word in $words
) for txtfile in *.txt; do ...
) ~
被解释为$HOME
( ~/"some dir"
而不是"~/some dir"
) 也可以看看: