ファイルに並んだユーザー名を1行ずつ読んで処理するスクリプトを書きたい
くり返しはどう書くん?
【疑問】ユーザー一覧を1行ずつ処理したい。for・while・read・seq と exec、条件に合ったら root にメール【LPICレベル1】
前提のおさらい。[ ] は test コマンドで、条件が正しければ終了ステータス0。if の条件にはどんなコマンドも書ける
>>1
決まった並びを順に回すなら forfor i in 1 2 3; do …; donefor f in *.sh; do …; done で .sh のファイルを1つずつfor i in $(seq 3); do …; done で 1 から 3
>>3
seq は数の並びを出すコマンドseq 3 → 1 2 3seq 2 5 → 2 3 4 5seq 1 3 10 → 1 4 7 10(3つずつ)seq -w 8 10 → 08 09 10(桁をそろえる)seq -s, 3 → 1,2,3
>>1
1行ずつ読むのは while と readwhile IFS=: read name x uid; do echo "$name=$uid"; done < pwuser:x:1000 と root:x:0 の2行のファイルで、user=1000 と root=0 が出た
>>5
read の動きをもう少し
変数が足りないと、残りは最後の変数にまとめて入る。echo "a b c" | { read x y; } で x=a、y=b c
変数を書かないと REPLY に入るIFS=: で区切りを : に変えられる
>>5cat pw | while read l; do n=$((n+1)); done にしたら、終わったあと n が0のままやった
>>7
パイプの右側は子のシェルで動くから、中で変えた変数が外に戻らない。done < pw のようにリダイレクトで渡すと、同じシェルで動いて n=2 になった
>>5
条件が成り立つ間は while、成り立つまでは until。until [ $i -ge 2 ] は i が2になったら止まる
>>2
exec って何に使うん?
>>10
2つの使い方があるexec コマンド 今のシェルをそのコマンドに置き換える。exec echo replaced; echo notreached は replaced だけ出て、後ろは動かへんかったexec > out.log そのあとの出力を全部ファイルへ。スクリプトの先頭に書くとログを取れる
>>11
置き換えやから PID も変わらへん。echo $$; exec bash -c 'echo $$' で同じ番号が2回出た
>>1
ディスクが一杯に近いときだけ root にメールしたい
>>13
条件で分けて、本文を mail に渡すif [ "$use" -ge 90 ]; then echo "使用率 $use%" | mail -s "disk warning" root; fi-s が件名、最後が宛先。何もなければ何も送らない
>>14
mail コマンドは mailutils や bsd-mailx などのパッケージに入ってて、送るには MTA(postfix など)が要る。試した環境には入ってなかったから、ディストリビューションやインストールの内容で使えるかどうかが違う
>>14
use は df --output=pcent / | tail -1 | tr -dc 0-9 みたいにして数字だけ取り出す
>>8
並びは for と seq、行は while read で < から、置き換えとログは exec、知らせるのは if と mail。パイプの右の変数には気をつける
管理人のひとこと
- for は並びを順に回す(
for f in *.sh、for i in $(seq 3))。seq:seq 終わり、seq 始め 終わり、seq 始め 増分 終わり、-w桁をそろえる、-s区切り。 - while は条件が成り立つ間、until は成り立つまで。1行ずつ読むなら
while read 変数; do …; done < ファイル。read は変数が足りないと残りを最後の変数に入れ、変数を省くと REPLY。区切りは IFS。 - パイプの右側は子のシェルなので、中で変えた変数は外に戻らない。
exec コマンドは今のシェルを置き換え(PID は同じ、後ろは動かない)。exec > ファイルは以降の出力をまとめて切り替える。- 管理者への通知は
echo 本文 | mail -s 件名 rootを if の中で。mail と MTA は入っているパッケージによる。