Bash 用变量替换显式字符串在shell脚本中出现问题

Bash 用变量替换显式字符串在shell脚本中出现问题,bash,shell,sh,Bash,Shell,Sh,我一直在使用一个shell脚本,用于执行以下操作: output=$(ls -R /logs/{abc,cde}/"$((${date}/100))"/*/out*${date}* | grep -v "Random" ) echo $output 在运行这个命令时,我通常在相关位置使用abc或cde获取文件。您可以忽略其他变量,如日期等 但是,当我修改脚本,将abc、cde作为命令行参数而不是脚本中的硬编码时,它停止了工作。 我将命令更改为: output=$(ls -R /logs/{${

我一直在使用一个shell脚本,用于执行以下操作:

output=$(ls -R /logs/{abc,cde}/"$((${date}/100))"/*/out*${date}* | grep -v "Random" )
echo $output
在运行这个命令时,我通常在相关位置使用abc或cde获取文件。您可以忽略其他变量,如日期等

但是,当我修改脚本,将abc、cde作为命令行参数而不是脚本中的硬编码时,它停止了工作。 我将命令更改为:

output=$(ls -R /logs/{${list}}/"$((${date}/100))"/*/out*${date}* | grep -v "Random" )
其中列表为abc、cde


我尝试了很多不同的引号组合等,但似乎不起作用。有人能帮我解释一下正确的语法吗?

它不工作,因为扩展顺序阻止了它

展开顺序为:支撑展开;瓷砖扩展, 参数与变量展开

您可以使用
eval
来解决这个问题,但是应该避免使用
eval

在这里使用
find
可能更好

find /logs -name 'abc/...' -o -name 'cde/...' 
这甚至适用于变量

或者使用正则表达式逻辑

find /logs/ -regex '/logs/\(abc\|cde\).*'
试试这个

  • 将abc和cde分配给数组 前- 声明-a ARR=(abc cde)

  • 将其分配给变量,如下所示

    output=
    ls-R/logs/${ARR[@]/“$((${date}/100))”/*/out*${date}*| grep-v“Random”


  • $list
    代替
    $(list)
    ?(这不是一个需要执行的命令,它只是一个变量)@Dominique,但他使用了
    ${list}
    ,好的,我试着同时使用$list和${list}。两者都不起作用。这回答了你的问题吗?@ShubhiAgarwal,Shubhi,你能在这里提到完整的要求吗?因为从来都不建议解析ls输出,我想在这里找到一些有用的东西,所以请用完整的细节编辑你的问题,然后让我们知道。这似乎是错误的,因为这涉及到
    /logs/abc/…
    和into
    /cde/…
    @ShubhiAgarwal:这解决了您的问题,请接受答案,这样其他用户就知道这个问题已经解决了,不再需要花费更多的精力来解决它。