crontabやansibleを使ってると、条件に応じたコマンドや複数コマンドの実行を一行に記述したい場合が案外多い.
スクリプトファイルを用意して実行すれば言われそうだが、たかが数行のためにファイルにおこすの面倒だし、なんせファイルの管理をしなければならない.
そんな時に1行で済む便利なシェルコマンドの書式をまとめておきます.
※ 以下の例は別のコマンドやオプションを使えば本来1コマンドで済みますが、説明の便宜上少し回りくどいコマンドにしています.
コマンド1 || コマンド2
コマンド1が異常終了ならコマンド2を実行
$> ls hello.txt || echo "Hello!" > hello.txt
hello.txtが存在しなければ、文字列"Hello!"をhello.txtに出力して生成.
コマンド1 && コマンド2
コマンド1が正常終了ならコマンド2を実行
$> ls hello.txt && rm -f hello.txt
hello.txtが存在したら、hello.txtを削除.
"[ 条件式 ]"の利用
以下のように、シェルスクリプトのif文で用いる "[ 条件式 ]" を利用した書き方も可能です.
$> [ -f hello.txt ] || echo "Hello!" > hello.txt
$> [ -f hello.txt ] && rm -f hello.txt
[ -f hello.txt ] は "hello.txtがファイルである"->真. ファイルでない/存在しない->偽.
条件式の書式はシェルスクリプト入門サイトなどに詳細な説明があるので割愛します.
コマンド1; コマンド2
コマンド1を終了したら、結果に関わらずコマンド2を実行
$> ls hello.txt; cp hello.txt yeah.txt
hello.txtの有無を確認し、その結果に関わらずhello.txtのコピーをyeah.txtとして生成する
hello.txtがない場合、それにも関わらずコピーしようとするので後者cpコマンドはエラー.
コマンド1 | コマンド2
言わずと知れたパイプ処理. コマンド1の出力をコマンド2の入力として実行.
$> ps aux | grep ntpd
プロセス一覧リストを出力して、そのうち"ntpd"が含まれる行を出力.