Lから始まるLinux

3章11話
while文(実践)
3章12話 制御文とリダイレクト
もくじ
3章13話
exitコマンド
制御文とリダイレクト
若木 しげる
制御文 if, case, for, while リダイレクトと組み合わせるられるんだ!
若木 みどり(驚き)
えっ? そうなの?!
若木 しげる
今回は制御文とリダイレクトを 組み合わせるとどうなるかを 見ていこう!
制御文と入力リダイレクト
若木 しげる
最初は「入力リダイレクト <だよ 以下の例を見てみよう
while read LINE
do
  ...
done < ファイル
若木 みどり
1行ずつ読む内容をファイル から読み込むんだね!
若木 しげる
そのとおり!制御文末尾の記述へ入力リダイレクトしてあげればいいんだ
若木 みどり
for文の場合はdone に対して入力リダイレクトを書けばいいんだね!
若木 しげる
入力は「ヒアドキュメント <<「ヒアストリング <<<でも可能だよ
制御文と出力リダイレクト
若木 しげる
今度は「出力リダイレクト >だよ
while read LINE
do
  ...
done > ファイル
若木 みどり
「入力リダイレクト」同じように使えるんだね!
若木 しげる
通常if文やcase文は入力リダイレクトを必要としないけど出力リダイレクトを使うことがあるよ!
若木 しげる
以下はif文の処理の「標準出力」「標準エラー」へ書き出してくれるんだ
if コマンド
then
  ...
fi >&2
若木 しげる
追記 >> でも同じように使えるよ!
制御文とパイプ
若木 みどり
リダイレクトが使えるということはもしかしてパイプも使えたりする?
若木 しげる
うん、使えるよ!パイプの前でも後ろでも両方の書き方ができるんだ
若木 しげる
以下は while文で全てのユーザ名を処理するよ
awk -F: '{ print $1 }' /etc/passwd |
while read USERNAME
do
  ...
done
若木 みどり
あれ?1行目の最後、パイプの後に「バックスラッシュ(\)」いらないのかな?
若木 しげる
この場合は不要なんだパイプのように「次の記述があるはず」とわかる記述では続く記述がなければ次の行に続いていると自動的に判断されるよ
若木 しげる
他にもAND 演算子 &&OR 演算子 || でも同じような動きになるよ
若木 みどり(驚き)
へぇ…こういう場合は「バックスラッシュ(\)」を省略できるんだね
制御文どうしを組み合わせる
若木 しげる
発展的な話をしよう!なんと制御文どうしをパイプで繋げられるんだ!
if ...
then
  ...
else
  ...
fi |
while read LINE
do
  ...
done
若木 みどり(驚き)
while 文で1行ずつ読む内容をif 文の条件で変えているんだね
若木 みどり
すごい柔軟にできそうだけど色々な要素がからんで難しいよ…
若木 しげる
あくまで発展的な使い方だからね使うのは実力が付いてからでも十分だよ!
まとめ
若木 みどり
今回は「制御文」「リダイレクト」組み合わせられることを学んだよ!グルーピング { ... }近いイメージで使えるんだね!
若木 しげる
これまで学んだ制御文をさらに色々なことに使える記述だよ難しいので急いで覚える必要はないけど知っておくと記述の幅が広がるよ!