csh シェルのコマンドプロンプトで for ループを使用する方法 — まともなワンライナーを探しています
質問
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
ループ内で実行されています。