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

Bash - nested variable expansion inside command assignment

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

调用:./myscript.sh testFile

脚本:

#!/bin/bash

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

输出:

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

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

我尝试了一些其他版本,也尝试过创建一个包含整个命令的变量,但后来我得到的输出甚至更少。

如果我做 test="$($awk)" 我得到

'/testFile/{print }'
ls -l | awk '/testFile/{print }'
ls: }': 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 }'
ls -l | awk '/testFile/{print }'
usage: awk [-F fs] [-v var=value] [-f progfile | 'prog'] [file ...]

因为我的 Google 查询基本上只包含单词 "bash command variable assignment",所以我无法获得与此处的嵌套变量扩展相关的任何信息。我根据错误了解它在做什么,但我不能说为什么或如何修复它。

如果有人可以提供修复并解释或指出资源来解释这里发生的事情,我们将不胜感激。或者甚至还有另一种方法可以简化逻辑。

谢谢!

更改为:

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

awk 要求脚本是单个参数。但是当你在双引号外扩展一个变量时,shell 执行分词,所以 $awk 被扩展为两个参数:

  1. '{print
  2. }'

引号将扩展作为单个参数。

另外,去掉

中的单引号
awk="'/$file/$awk'"

扩展变量后不处理单引号,因此它们将直接传递给 awk。在 $awk 周围加上双引号可实现您尝试使用这些引号获得的结果。