Bash脚本:参数替换问题

Bash脚本:参数替换问题,bash,command-line,parameters,shell,Bash,Command Line,Parameters,Shell,我正在尝试编写一个简单的bash脚本,但似乎有问题,我正在命令行上测试以下内容: DATE="2010-09-{10,11}" result=`\ls *ext.$DATE.Z` 并导致ls:无法访问*ext.2010-09-{10,11}.Z:没有这样的文件或目录 但如果我执行这个: result=`\ls *ext.2010-09-{10,11}.Z` 它工作完美无瑕 我甚至尝试从DATE参数中删除引号,但这不是问题所在,bash手册没有帮助,我做错了什么?它不是应该执行参数替换并将其传

我正在尝试编写一个简单的bash脚本,但似乎有问题,我正在命令行上测试以下内容:

DATE="2010-09-{10,11}"
result=`\ls *ext.$DATE.Z`
并导致ls:无法访问*ext.2010-09-{10,11}.Z:没有这样的文件或目录

但如果我执行这个:

result=`\ls *ext.2010-09-{10,11}.Z`
它工作完美无瑕

我甚至尝试从DATE参数中删除引号,但这不是问题所在,bash手册没有帮助,我做错了什么?它不是应该执行参数替换并将其传递给我的命令吗

我想我应该逃离美元标志,但那也没用

编辑-有意添加的解释


我试图完成的是用与给定模式匹配的所有文件名填充变量result*ext.2010-09-{10,11},我知道我可以使用for循环解决这个问题,但我考虑过使用大括号来缩短时间。

问题是当您直接在命令行上执行它时\ls*ext.2010-09-{10,11}.Z是一个缩写形式,通过命令行扩展为两个命令:ls*ext.2010-09-10.Z和ls*ext.2010-09-11.Z,每个命令随后都被调用。ls本身不直接支持这样的表达式,所以当您将它构建到脚本中时,它会得到它不理解的文本字符串

并非所有命令行都支持大括号扩展,并且:

不应在中使用支撑展开 可移植shell脚本,因为 伯恩壳牌公司不会生产同样的产品 输出

下面是一个解决方案脚本:

#!/bin/sh
DAYS="10 11"
for i in $DAYS;
do
  ls *ext.2010-09-$i.Z
done

如果将{x,y}组分配给变量,则该组不再展开。但是你可以组成一个像ls这样的字符串。。。并将其提交给评估功能。
再见

这是因为大括号展开发生在变量展开之前。首先,它展开大括号-除非在ls的参数中没有大括号。然后它展开变量。然后它运行它。现在展开大括号已经太晚了


如果您详细说明您试图解决的具体问题,我可能会帮助您找到更好的方法。

这会将您要查找的文件名放入变量中:

result=$(echo *ext.2010-09-{10,11}.Z)

正确,你的帖子完成了我的简短解释。但是问题被标记为[bash]而不是[sh]或[bourne],如果你有一个shebang,它会说/bin/bash您应该能够使用bash功能。eval是不安全的,可能会引入安全漏洞。可能有更好的方法为什么要像\ls一样运行它?别名不会遗留到脚本中。