【问题标题】:escape dollar sign in bashscript (which uses awk)在 bash 脚本中转义美元符号(使用 awk)
【发布时间】:2017-01-23 08:18:30
【问题描述】:

我想在我的 bashscript 中使用 awk,这行显然行不通:

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

如何转义$1,使其不会被脚本的第一个参数替换?

【问题讨论】:

  • 不会被替换。这将是"$line"中的第一个词
  • awk“程序”周围的那些单引号的真正目的是确保 bash 不会尝试执行任何参数扩展,因此您的脚本将按预期工作。
  • @CostiCiudatu 这个词是扩展
  • @Nirk:你是对的!我很尴尬(我希望我拼写正确):)

标签: bash awk


【解决方案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 Reference Manual - Quoting和Shell Expansions

【讨论】:

  • @cmbuckley 如何将美元符号转义为:'{print "$line, " $1}'
【解决方案2】:

正如目前所写,$1 不会被替换(因为它在单引号字符串中,bash 不会解析它)

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

注意变量扩展规则依赖于最外层的引用,所以"awk '{print $1}'"中的$1会被扩展

【讨论】:

  • 如何做一个别名:alias awkprt='awk "{print $1}"',如何让它不被扩展?
  • 刚刚从stackoverflow.com/questions/7244534/…得知我们只需要用反斜杠转义:alias awkprt="awk '{print \$1}'"
猜你喜欢
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 2016-10-19
  • 2023-03-03
  • 2013-04-11
  • 2015-06-17
  • 2021-07-01
相关资源
最近更新 更多