【问题标题】:How to pass a shell variable to awk in Bourne shell?如何在 Bourne shell 中将 shell 变量传递给 awk?
【发布时间】:2012-03-04 17:50:06
【问题描述】:

我是 Bourne shell 的新手,想做简单的数组模拟。这有效:

COLORS='FF0000 0000FF 00FF00'
i=2
color=$(echo ${COLORS} | awk '{print $2}')
echo "color selected: $color"

我想要做的是在 print 中传递$i 而不是固定的$2 参数(稍后将在循环中使用)。我花了几个小时找出单引号和双引号的正确组合来做到这一点,但没有运气。

我得到的最接近的是

color=$("echo ${COLORS} | awk '{print "$"${i}}'")

运行结果为:

+ COLORS=FF0000 0000FF 00FF00
+ i=2
+ echo FF0000 0000FF 00FF00 | awk '{print $2}'
./tempgraph.sh: ./tempgraph.sh: 37: echo FF0000 0000FF 00FF00 | awk '{print $2}': not found
+ color=
+ echo color selected:
color selected:

感谢任何帮助。

【问题讨论】:

    标签: awk sh


    【解决方案1】:

    不要浪费时间试图让 shell 在 awk 命令中正确扩展变量,只需使用 -v 定义一个变量即可:

    echo $COLORS | awk -v col=2 '{ print $col }'
    

    就您的 i 变量而言,它变为:

    i=1
    echo $COLORS | awk -v col=$i '{ print $col }'
    

    【讨论】:

    • 谢谢,这很好用。我接受了另一个答案,因为它可能会帮助其他在 shell 引用方面苦苦挣扎的人。
    【解决方案2】:

    你也可以直接进入你的环境:

    export COLORS='FF0000 0000FF 00FF00'
    awk 'END {split(ENVIRON["COLORS"],colors);for(col in colors) { print "Color",col,"is",colors[col]}}' /dev/null
    

    在这个 mac 上给出以下输出:

    Color 2 is 0000FF
    Color 3 is 00FF00
    Color 1 is FF0000
    

    【讨论】:

    • 您也可以通过export i 或通过i=1 awk ... 调用awk 以同样的方式访问i
    • 没错。这有助于避免引用问题,并允许您从环境中获取任意数量的值。这就是 Unix™ 的优点:我们有多种方法可以将相关信息导入程序。
    【解决方案3】:

    我会这样做:

    color=$(echo ${COLORS} | awk "{print \$$i}")
    

    如果使用'...',则内容不展开。但是您希望在脚本中插入 $i 的值。所以要使用"...",它会进行变量扩展。但是您还希望在 AWK 的数字前面有一个 $,因此您必须将其转义 (\$)。

    【讨论】:

    • 谢谢!它运作良好,虽然我不确定我是否能更好地理解引号。有人会认为双引号在扩展其中的内容后被 shell 吃掉了,但似乎它们也被传递给了 awk。
    • 它们被shell吃掉了,但是单引号也是如此。两者都包含一个字符串。例如,通常foo a ba 作为第一个参数传递给foo,并将b 作为第二个参数传递。但是对于foo "a b",shell 将a b 作为唯一参数传递给foo。单引号和双引号之间的最大区别在于,使用双引号,您可以“嵌入”其他内容,例如变量:如果您确实将 '$i' 作为参数传递,则实际上字符串 $i 会被传递。但是对于"$i",变量i的内容是通过的。
    【解决方案4】:

    -v foo=bar 这样在调用时分配的变量在BEGIN 中可用,而用简单的baz=qux 分配的变量则不可用。

    BEGIN { print foo, bar; }
    { print foo, bar; }
    

    看看区别:

    echo Don\'t Panic! | awk -f ./hello.awk -v foo=Hello bar=World
    Hello
    Hello World
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 2012-04-01
      • 1970-01-01
      • 2014-03-11
      • 1970-01-01
      • 1970-01-01
      • 2021-06-21
      相关资源
      最近更新 更多