linux - shell引号里变量 - 反引号英文




何时在shell变量中引用引号? (3)

一般来说,这里是一个三点的引用公式:

双引号

在我们想要抑制分词和通配的环境中。 在上下文中,我们希望文字被视为字符串,而不是正则表达式。

单引号

在字符串文字中,我们想要抑制反斜线的插值和特殊处理。 换句话说,使用双引号的情况是不合适的。

没有引号

在我们绝对确信没有任何分词或通配问题的情况下,或者我们希望分词和匹配

例子

双引号

  • 带空格的字符串( "StackOverflow rocks!""Steve's Apple"
  • 变量扩展( "$var""${arr[@]}"
  • 命令替换( "$(ls)""`ls`"
  • 其中目录路径或文件名部分包含空格的球体( "/my dir/"*
  • 保护单引号( "single'quote'delimited'string"
  • Bash参数扩展( "${filename##*/}"

单引号

  • 命令名称和参数中有空格
  • 需要插值的文本字符串被压制( 'Really costs $$!''just a backslash followed by at: \t'
  • 保护双引号( 'The "crux"'
  • 需要插值的正则表达式文本被抑制
  • 使用shell引用涉及特殊字符的文字( $'\n\t'
  • 在我们需要保护几个单引号和双引号的地方使用shell引用( $'{"table": "users", "where": "first_name"=\'Steve\'}'

没有引号

  • 围绕标准数字变量( $$$?$#等)
  • ((count++))"${arr[idx]}""${string:start:length}"等算术语境中
  • [[ ]]表达式内部,不存在分词和通配问题(这是一个风格和意见可能差异很大的问题)
  • 我们想要分词的地方( for word in $words
  • 我们需要globbing( for txtfile in *.txt; do ...
  • 我们希望被解释为$HOME~/"some dir"而不是"~/some dir"

也可以看看:

  • Bash中单引号和双引号之间的区别
  • 什么是特殊的美元符号shell变量?

有人能告诉我是否应该在shell脚本中将引号包含在变量中吗?

例如,以下是正确的:

xdg-open $URL 
[ $? -eq 2 ]

要么

xdg-open "$URL"
[ "$?" -eq "2" ]

如果是这样,为什么?


一般规则:如果它可以是空的或包含空格(或任何空格)或特殊字符(通配符),则引用它。 不用空格引用字符串通常会导致shell将单个参数拆分为许多。

$? 不需要引号,因为它是一个数字值。 $URL是否需要它取决于您允许的内容以及是否仍然需要参数(如果它为空)。

由于这种方式更安全,我倾向于总是引用字符串。


除非我确定$var不包含空格,否则我通常使用引号"$var"来确保安全。

我使用$var作为连接线条的简单方法:

lines="`cat multi-lines-text-file.txt`"
echo "$lines"                             ## multiple lines
echo $lines                               ## all spaces (including newlines) are zapped




quotes