Bash脚本:参数替换问题

时间:2010-09-17 15:37:06

标签: 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手册没有帮助,我做错了什么?是不是应该执行参数替换并将其传递给我的命令?

我认为我应该逃避$符号,但这也不起作用。

编辑 - 有目的的解释

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

4 个答案:

答案 0 :(得分:4)

问题是当你在命令行上直接执行它时\ls *ext.2010-09-{10,11}.Z是一个简短的表单,它被扩展为两个命令:ls *ext.2010-09-10.Zls *ext.2010-09-11.Z(由命令行 - 随后被调用)。 ls本身并不直接支持这样的表达式,因此当你将它构建到脚本中时,它会得到它不理解的文字字符串。

所有命令行都不支持Brace扩展,isn't recommended for shell scripts

  

不应使用Brace扩展   便携式shell脚本,因为   Bourne shell不会产生相同的效果   输出

这是一个解决方案脚本:

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

答案 1 :(得分:3)

这是因为大括号扩展在变量扩展之前发生。首先,它扩展括号 - 除了ls的论证中没有。然后它扩展变量。然后运行它。在这一点上,扩大括号已经太晚了。

如果你详细说明你想要解决的具体问题,我可以帮助你找到更好的方法。

答案 2 :(得分:1)

如果将{x,y}组分配给变量,则不再展开{x,y}组。但是你可以编写一个像“ls ...”这样的字符串并将其提交给“eval”函数。 再见!

答案 3 :(得分:0)

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

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