我有一个命令:
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"