csh / sh for循环 - 怎么样?

时间:2011-05-13 14:21:08

标签: bash shell sh csh

我正在尝试编写一个在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";
   }
}

有人知道怎么做吗?

由于

5 个答案:

答案 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