' 和 " 之间的区别

' 和 " 之间的区别

我有一个命令:

synclient -l | awk -v param_name=$param_name '$1==param_name {print $(NF)}'

其输出仅为:0

但如果我将两者都替换'",我会得到:

Command 'NF' not found, but can be installed with:
sudo apt install byobu
awk: cmd. line:1: ==param_name {print }
awk: cmd. line:1: ^ syntax error

sh -c当我使用以下命令时出现相同的错误:

sh -c "synclient -l | awk -v param_name=$param_name '$1==param_name {print $(NF)}'"
sh -c 'synclient -l | awk -v param_name=$param_name "$1==param_name {print $(NF)}"'

'这里的和有什么区别"?为什么会这样?

答案1

bash手动的

将字符括在单引号 ( ') 中可保留引号内每个字符的字面值。[...]

将字符括在双引号 ( ) 中会保留引号内所有字符的文字值,但启用历史记录扩展时的、、和"除外。$`\!

双引号在这里显然是错误的方法。

在您的情况下,$is 没有为 保留awk,而是通过 进行评估bash,这导致了 2 个错误。

  • bash在您的情况下扩展$1为空,这就是为什么awk会抱怨语法错误。
  • $(NF)命令替换,因此bash尝试运行名为 的命令NF,但该命令不可用。

此外,您应该使用双引号$param_name,否则如果它包含空格,则会导致错误。

-v param_name="$param_name"

相关内容