Bash循环和函数参数扩展
问题描述:
我有一个循环在bash脚本中不起作用,我看不出什么是错的。Bash循环和函数参数扩展
#!/bin/bash
function deleteOut {
for index in {0..$1}
do
echo "/bin/rm -rf ./OUT/Message_${index}.log"
/bin/rm -rf ./OUT/Message_${index}.log
done
}
,并呼吁它使用
deleteOut 5
我期待一个循环像
/bin/rm -rf ./OUT/Message_0.log
/bin/rm -rf ./OUT/Message_1.log
/bin/rm -rf ./OUT/Message_2.log
/bin/rm -rf ./OUT/Message_3.log
/bin/rm -rf ./OUT/Message_4.log
/bin/rm -rf ./OUT/Message_5.log
相反,我得到了
/bin/rm -rf ./OUT/Message_{0..5}.log
我已经解决了做这样的事情,而不是
find ./OUT -name "Message_*.log" | xargs /bin/rm
的问题,但这不是重点。为什么我的第一种方法不起作用?
答
使用eval
或子shell
括号扩展来前变量扩展
for index in $(eval "echo {0..$q}")
do
echo $index
done
答
您可以使用seq
,这是一般较安全eval
:
for index in $(seq $1)
甚至更快without any external program:
for ((index=1; index<=$1; index++))
如果index = 0,则第二个命令将是正确的。第一个命令是不可用的,因为范围是0 .. $ 1和seq(据我所知)从1开始。但实际上你正在回答如何遍历文件,而我的问题是关于范围中的参数扩展。 “sehe”的答案是正确的:“Brace扩展在变量扩展之前出现”(我不知道它)。无论如何,谢谢你的回答。 – Luixv 2012-02-08 14:09:07
该链接解释了扩展问题以及更多信息的链接。 – l0b0 2012-02-08 14:35:08