我确信这很简单,但我是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;,我无法获得与此处嵌套变量扩展相关的任何内容。我理解它根据错误做了什么,但我无法说明为什么或如何解决它。
如果有人可以提供解决方案,并向我解释或指出一个资源,解释这里发生了什么,我们将不胜感激。或者甚至还有另一种方法可以简化逻辑。
谢谢!
答案 0 :(得分:1)
更改为:
test="$(ls -l | awk "$awk")" # error
awk
要求脚本是单个参数。但是当您在双引号外扩展变量时,shell会执行分词,因此$awk
会扩展为两个参数:
'{print
$9}'
引号将扩展保持为单个参数。
另外,从
中取出单引号awk="'/$file/$awk'"
扩展变量后不会处理单引号,因此它们会按字面传递给awk
。在$awk
附近加上双引号可以达到您尝试使用这些引号获得的结果。