cshってfor文ないんだって...
世の中色んなプログラミング言語がありますけど、
for文がない言語なんてあるのでしょうか?
それがあるんです。
ズバリcsh
cshはfor文がありませんが、
ループ構文が無いわけではありません。
代わりに用意されているのがforeachとなります。
foreach
foreach 変数 ( リスト )
コマンド
end
foreachは()内でリストファイルの中身を一つずつ取り出し、
指定した変数に値を格納します。
リスト内からすべての値を取り出したらループ終了です。
リストに変数の値を使用する
リストはスペース区切りで判定されます。
なので変数に以下のように値を定義することで、
foreachで扱えるリストが作成できます。
set lists = "test1 test2 test3"
この仕組みを利用して以下のような処理作成してみました。
プロセス確認を行う
set processes = "OneDrive firefox"
foreach pname(${processes})
set pcount = `ps aux | grep "${pname}" | grep -v "grep" | wc -l`
if ( 0 < $pcount ) then
echo "${pname}:稼動状態"
else if ( $pcount == 0 ) then
echo "${pname}:停止状態"
else
echo "カウント値が不正です"
endif
end
処理概要
プロセス名は任意ですがここでは"OneDrive"と"firefox"とします。
- 変数"process"に起動有無を確認したいプロセス名をスペース区切りで定義します。
- 変数process内の値をforeachで取り出し、変数pnameに格納します。
- psコマンドの出力結果をgrepで絞ります。同名のプロセスが稼働していれば"wc -l"で行カウントされます。
- カウントの結果を変数pcoutに格納しif文で判定処理を行います。
OneDrive:起動中
firefox:起動中
リストから一括でプロセスkillを行う
set processes = "OneDrive firefox"
foreach pname($processes)
set pid = `ps aux | grep "${pname}" | grep -v "grep" | awk '{print $2}'`
kill -15 $pid
end
基本はプロセス確認と同じです。
awkでPIDを抜き出して、そのPIDに対してkillしています。
余談
Unix系のforは他のPG言語と異なり、
ちょっと変わった書き方をしますが、
その面cshの書き方はわかりやすいですね。
cshはC言語っぽい書き方を特徴としているため、
生粋の開発者からすると他のシェルよりも書きやすいのかもしれませんね(私は開発者ではないですが、、、)
追記:cshはシェルスクリプトには向かないそうです。詳細はコメント欄
自分が運用などで面倒を見たシステムなどはなぜかcshでスクリプトが記載されていることが多いですが(ログインシェルはcshではないのに...)ここら辺が起因しているのだろうか?