我正在尝试编写一个简单的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循环,但我考虑使用花括号来缩短。
答案 0 :(得分:4)
问题是当你在命令行上直接执行它时\ls *ext.2010-09-{10,11}.Z
是一个简短的表单,它被扩展为两个命令:ls *ext.2010-09-10.Z
和ls *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)