我想在我的bash脚本中使用awk,但是这行代码明显无法正常工作:
line="foo bar"
echo $line | awk '{print $1}'
我该如何转义$1
,以免它被脚本的第一个参数所替换?
您的脚本(awk脚本周围有单引号)将按预期工作:
$ cat script-single
#!/bin/bash
line="foo bar"
echo $line | awk '{print $1}'
$ ./script-single test
foo
然而,下列内容会导致脚本出现问题(脚本将输出一行空白):
$ cat script-double
#!/bin/bash
line="foo bar"
echo $line | awk "{print $1}"
$ ./script-double test
注意在 awk
程序周围的双引号。
由于双引号扩展了 $1
变量,awk 命令将获取脚本 {print test}
,它会输出 awk 变量 test
的内容(为空)。这是一个演示的脚本:
$ cat script-var
#!/bin/bash
line="foo bar"
echo $line | awk -v test=baz "{print $1}"
$ ./script-var test
baz
相关阅读: Bash 参考手册 - 引用 和 Shell 扩展
$line, " $1
中转义美元符号? - tachomi目前写的代码中,$1不会被替换(因为它在单引号字符串内,bash不会解析它)
如果你写awk "{print $1}"
,bash将在双引号字符串中扩展$1
请注意,变量扩展规则取决于最外层的引号级别,因此在"awk '{print $1}'"
中的$1
将被扩展。
alias awkprt='awk "{print $1}"'
,让它不被扩展? - MeadowMuffinsalias awkprt="awk '{print \$1}'"
。 - MeadowMuffins
"$line"
中的第一个单词。 - user000001