2009-10-09 36 views

回答

2

哇,我已經很多年沒有寫過劇本csh。但比爾·喬伊都寫自己,我想這是值得留戀的一些努力......

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

或只是foreach i (*)

這個循環結構,一個內置的概念,CSH有字的效果很好列表。這是在bash中存在的,但不是在香草posix shell中。

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

foreach循環通過該數據結構整齊迭代。

+1

*更新:*好的,好吧,我不知道如何在csh中執行單線程循環。 csh語法處理';'和換行符的方式不同。這不是單線友好的。 – DigitalRoss 2011-10-12 15:40:30

10

csh手冊頁指出:

在foreach,switch和while語句,以及在if-then-else的if語句的形式要求主要關鍵字出現在一個簡單的命令在輸入行上,如下所示。

兩者的foreach和端必須單獨出現在不同的行。

別人的文字和ENDIF必須出現在輸入行開始;如果必須單獨出現在其輸入行或其他之後。

while和end必須單獨對他們的輸入線出現。

+2

另請參閱Csh編程中的「流量控制」認爲有害:http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/ – 2010-07-23 15:21:44

1

我要說的是,我已經弄好了,固定它儘管CSH選項,這樣你就可以做這樣的事情:

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

我掙扎着輕鬆遍歷得到CSH外殼並運行相同命令結束。

正如指出的這樣的回答: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 hi,sleep 2secho done waiting正在循環中運行。