Bash - 命令赋值中的嵌套变量扩展

时间:2016-05-03 17:18:00

标签: bash assign expansion

我确信这很简单,但我是bash脚本的新手,这里的语法过程超出了我的范围。我似乎找不到合适的搜索字词来找到我需要的东西。这个剧本真的只是我最终版本的踏脚石。

调用:./ myscript.sh testFile

脚本:

#!/bin/bash

file=$1
awk='{print $9}' # do not expand $9
awk="'/$file/$awk'" # DO expand file argument
echo "$awk" # prints '/graphic/{print $9}' (as expected)
echo "ls -l | awk $awk" # prints ls -l | awk '/graphic/{print $9}' (as expected)
test="$(ls -l | awk $awk)" # error
echo "$test"

输出:

'/testFile/{print $9}'
ls -l | awk '/testFile/{print $9}'
awk: syntax error at source line 1
 context is
     >>> ' <<< 
    missing }
awk: bailing out at source line 1

即使我可以复制并运行第二个回声线并且它成功运行,但命令的失败让我相信这不是简单的字符串连接,而是一些更疯狂的伏都教。

我尝试了其他一些版本,就像创建一个包含整个命令的变量一样,但是我得到的预期输出更少。

如果我 test =&#34; $($ awk)&#34;

'/testFile/{print $9}'
ls -l | awk '/testFile/{print $9}'
ls: $9}': No such file or directory
ls: '/testFile/{print: No such file or directory
ls: awk: No such file or directory
ls: |: No such file or directory

如果我 test = $(awk)

'/testFile/{print $9}'
ls -l | awk '/testFile/{print $9}'
usage: awk [-F fs] [-v var=value] [-f progfile | 'prog'] [file ...]

由于我的Google查询基本上只包含单词&#34; bash命令变量赋值&#34;,我无法获得与此处嵌套变量扩展相关的任何内容。我理解它根据错误做了什么,但我无法说明为什么或如何解决它。

如果有人可以提供解决方案,并向我解释或指出一个资源,解释这里发生了什么,我们将不胜感激。或者甚至还有另一种方法可以简化逻辑。

谢谢!

1 个答案:

答案 0 :(得分:1)

更改为:

test="$(ls -l | awk "$awk")" # error

awk要求脚本是单个参数。但是当您在双引号外扩展变量时,shell会执行分词,因此$awk会扩展为两个参数:

  1. '{print
  2. $9}'
  3. 引号将扩展保持为单个参数。

    另外,从

    中取出单引号
    awk="'/$file/$awk'"
    

    扩展变量后不会处理单引号,因此它们会按字面传递给awk。在$awk附近加上双引号可以达到您尝试使用这些引号获得的结果。