csh シェルのコマンドプロンプトで for ループを使用する方法 — まともなワンライナーを探しています

StackOverflow https://stackoverflow.com/questions/1544325

  •  20-09-2019
  •  | 
  •  

質問

bash シェルから来ているので、簡単なループのローリング (for i in (...);) を見逃していました。する ...終わり;)

cshell の典型的なループのワンライナーを投稿していただけませんか?

複数行ではなく、1 行にしてくださいTHX

役に立ちましたか?

解決

うわー、書いてなかった csh 数年後の脚本。でも、ビル・ジョイ自身が書いたものなので、ノスタルジックな努力をする価値はあると思います...

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

あるいは単に foreach i (*)

このループ構造は、csh の組み込み概念とうまく機能します。 単語リスト. 。これは bash にはある種の存在ですが、バニラの posix シェルには存在しません。

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

foreach ループはこのデータ構造をきちんと反復します。

他のヒント

csh マニュアルページには次のように記載されています:

foreach、switch、while ステートメント、および if ステートメントの if-then-else 形式では、以下に示すように、主要なキーワードが入力行の 1 つの単純なコマンドに現れる必要があります。

そして

foreach と end は両方とも別の行に単独で指定する必要があります。

そして

else と endif という単語は入力行の先頭に出現する必要があります。if は入力行に単独で指定するか、else の後に指定する必要があります。

そして

while と end は入力行に単独で指定する必要があります。

csh オプションにもかかわらず、何らかの方法でそれを修正したと思います。そのため、次のようなことができます。

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

CSH シェルを簡単にループオーバーして同じコマンドを実行できるようにするのに苦労しました。

この回答で指摘されているように: https://stackoverflow.com/a/1548355/1897481

ワンライナーを機能させることを諦めさせられました。

最終的には、ループ内で引数* を指定してコマンドを実行するために、次のエイリアスを使用することに落ち着きました。

    # 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

この例では、3 つのコマンド echo hi, sleep 2s そして echo done waiting ループ内で実行されています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top