我正在尝试编写一个在FreeBSD上执行2个脚本的for循环。我不在乎它是用sh还是csh编写的。我想要这样的东西:
for($i=11; $i<=24; $i++)
{
exec(tar xzf 'myfile-1.0.' . $i);
// detect an error was returned by the script
if ('./patch.sh')
{
echo "Patching to $i failed\n";
}
}
有人知道怎么做吗?
由于
答案 0 :(得分:6)
在sh中执行此操作的典型方法是:
for i in $(seq 11 24); do
tar xzf "myfile-1.0$i" || exit 1
done
请注意,seq
不是标准。根据工具的可用性,您可以尝试:
jot 14 11 24
或
perl -E 'say for(11..24)'
或
yes '' | nl -ba | sed -n -e 11,24p -e 24q
我做了一些更改:如果tar失败并且不发出错误消息,我会中止,因为tar应该发出错误消息而不是脚本。
答案 1 :(得分:5)
哇!没有BASH。可能没有Kornshell:
i=11
while [ $i -le 24 ]
do
tar xzf myfile-1.0.$i
i=`expr $i + 1`
if ./patch.sh
then
echo "patching to $i failed"
fi
done
像上帝所预期的那样用纯粹的Bourne shell写成。
请注意,您必须使用expr
命令将{1}添加到$i
。 Bourne shell不做数学。反引号意味着执行命令并将命令中的STDOUT放入$i
。
Kornshell和BASH使这一过程变得更加容易,因为它们可以进行数学运算并为循环做更复杂的事情。
答案 2 :(得分:3)
csh做的循环很好,问题是你正在使用exec,它用一个不同的,在同一个进程中替换当前程序(它是shell)。由于其他人提供了sh版本,这里有一个csh:
#!/bin/csh set i = 11 while ($i < 25) tar xzf "myfile-1.0.$i" # detect an error was returned by the script if ({./patch.sh}) then echo "Patching to $i failed" endif @ i = $i + 1 end
不确定./patch.sh
您是在测试它的存在还是正在运行它?我在这里运行它,并测试结果 - true表示它返回零。可替换地:
# detect an error was returned by the script if (!{tar xzf "myfile-1.0.$i"}) then echo "Patching to $i failed" endif
答案 3 :(得分:-1)
我认为你应该使用bash。我在这里没有它,所以它无法测试它,但是这一点应该有效:
for ((I=11; I<=24; I++)) ; do
tar xzf myfile-1.0.$I || echo Patching to $I failed
done
编辑:只需阅读评论,发现FreeBSD默认安装中没有bash。所以这可能根本不起作用 - 我不确定(t)csh和bash之间的区别。
答案 4 :(得分:-1)
我刚刚做的就是以下内容。
SH
加载sh shell然后for循环就像在linux上一样。
for i in 1 2 3 4 5 6 7 8 9; do dd if=/dev/zero of=/tmp/yourfilename$i.test bs=52428800 count=15; done