在使用awk的bash脚本中如何转义美元符号

10

我想在我的bash脚本中使用awk,但是这行代码明显无法正常工作:

line="foo bar"
echo $line | awk '{print $1}'

我该如何转义$1,以免它被脚本的第一个参数所替换?


9
不会被替换。它将成为"$line"中的第一个单词。 - user000001
1
在awk“程序”周围加上单引号的目的是为了确保bash不会尝试执行任何参数扩展,因此您的脚本将按预期工作。 - Costi Ciudatu
1
@CostiCiudatu 这个词是“扩展”。 - SheetJS
@Nirk:你说得对!我感到很尴尬(希望我拼对了):) - Costi Ciudatu
2个回答

11

您的脚本(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 扩展


@cmbuckley 如何在 $line, " $1 中转义美元符号? - tachomi

4

目前写的代码中,$1不会被替换(因为它在单引号字符串内,bash不会解析它)

如果你写awk "{print $1}",bash将在双引号字符串中扩展$1

请注意,变量扩展规则取决于最外层的引号级别,因此在"awk '{print $1}'"中的$1将被扩展。


怎么样给它起个别名:alias awkprt='awk "{print $1}"',让它不被扩展? - MeadowMuffins
3
刚刚从 https://dev59.com/Omw05IYBdhLWcg3wcRUj 发现我们只需用反斜杠进行转义:alias awkprt="awk '{print \$1}'" - MeadowMuffins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接