首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >shell脚本中使用变量替换显式字符串的问题

shell脚本中使用变量替换显式字符串的问题
EN

Stack Overflow用户
提问于 2019-12-23 16:31:47
回答 2查看 91关注 0票数 1

我一直在使用一个shell脚本,它曾经做过这样的事情:

代码语言:javascript
复制
output=$(ls -R /logs/{abc,cde}/"$((${date}/100))"/*/out*${date}* | grep -v "Random" )
echo $output

在运行此命令时,我通常会在相关位置获取带有abc或cde的文件。您可以忽略其他变量,如日期等

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

代码语言:javascript
复制
output=$(ls -R /logs/{${list}}/"$((${date}/100))"/*/out*${date}* | grep -v "Random" )

其中list为abc,cde

我尝试了很多不同的引号组合,但似乎不起作用。有没有人能帮我找出正确的语法,让它正常工作

EN

回答 2

Stack Overflow用户

发布于 2019-12-23 16:44:51

它不起作用,因为展开顺序阻止了它。

展开顺序为:花括号展开、波浪线展开、参数展开、变量展开

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

也许在这里使用find会更好。

代码语言:javascript
复制
find /logs -name 'abc/...' -o -name 'cde/...' 

即使对于变量,这也是有效的

或者使用正则表达式逻辑。

代码语言:javascript
复制
find /logs/ -regex '/logs/\(abc\|cde\).*'
票数 1
EN

Stack Overflow用户

发布于 2019-12-23 17:18:48

试试这个

  1. 将abc和cde赋值给一个数组,不声明-a ARR=(abc Cde)
  2. 将其赋值给变量,如下所示。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59452200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档