如何在csh shell的命令提示符中使用for循环 - 寻找体面的一个衬里

时间:2009-10-09 14:55:48

标签: shell csh tcsh

来自bash shell,我错过了一个简单的循环滚动(对于我在(...);做...完成;)

你会在cshell中发布典型的单行循环吗?

ONE LINERS PLEASE,而不是多行 THX

4 个答案:

答案 0 :(得分:10)

csh手册页指出:

  

fore语句,switch语句和while语句以及if语句的if-then-else形式要求主要关键字出现在输入行的单个简单命令中。如下所示。

  

foreach和end必须单独出现在不同的行上。

  

else和endif必须出现在输入行的开头; if必须单独出现在输入行或其他地方之后。

  

while和end必须单独出现在输入行上。

答案 1 :(得分:2)

哇,多年来我没有写过csh剧本。但比尔乔伊自己写了这个,我想这值得一些怀旧的努力......

set t=(*)
foreach i ($t)
  echo $i >> /tmp/z
end

或仅foreach i (*)

这种循环结构适用于csh具有单词列表的内置概念。这种情况存在于bash中,但不存在于vanilla posix shell中。

set q=(how now brown cow)
echo $q[2]

foreach循环巧妙地遍历此数据结构。

答案 2 :(得分:1)

我会说我已经以某种方式解决了它,尽管有csh选项,所以你可以这样做:

printf "while ( 1 ) \n ps -aux|grep httpd \n echo 'just a new row' \n  sleep 2 \n end" | csh -f

答案 3 :(得分:0)

我努力让CSH shell轻松循环并运行相同的命令。

正如这个答案所指出:https://stackoverflow.com/a/1548355/1897481

让我放弃一个做一个oneliner工作。

最后决定使用以下别名在循环中运行带参数*的命令:

    # while_cmd_w_sleep <SLEEP-TIME> <CMD + ARGS>
    alias while_cmd_w_sleep '(echo '\''while (1)\n\!:2*\necho =================\necho Sleeping for \!:1.\nsleep \!:1\necho =================\nend'\'') | tcsh'

    # for_n_cmd <LOOP_COUNT> <CMD + ARGS>
    alias for_n_cmd         '(echo '\''foreach x (`seq \!:1`)\necho =================\necho Iteration \[$x]\necho =================\n\!:2*\nend'\'') | tcsh'

    # for_n_cmd_w_sleep <LOOP_COUNT> <SLEEP-TIME> <CMD + ARGS>
    alias for_n_cmd_w_sleep '(echo '\''foreach x (`seq \!:1`)\necho =================\necho Iteration \[$x]\necho =================\n\!:3*\necho =================\necho Sleeping for \!:2.\nsleep \!:2\nend'\'') | tcsh'

示例输出:

    $> for_n_cmd 3 echo hi
    =================
    Iteration [1]
    =================
    hi
    =================
    Iteration [2]
    =================
    hi
    =================
    Iteration [3]
    =================
    hi

while循环:

    $> while_cmd_w_sleep 2s echo hello there
    hello there
    =================
    Sleeping for 2s.
    =================
    hello there
    =================
    Sleeping for 2s.
    =================
    hello there
    =================
    Sleeping for 2s.
    ^C

*在循环中运行多个命令的示例:

    $> for_n_cmd 3 'echo hi\\nsleep 2s\\necho done waiting'
    =================
    Iteration [1]
    =================
    hi
    done waiting
    =================
    Iteration [2]
    =================
    hi
    done waiting
    =================
    Iteration [3]
    =================
    hi
    done waiting

在此示例中,循环中正在运行三个命令echo hisleep 2secho done waiting