処理を自動化する「コマンド結合」~ && と || と ; の違い~【続・Linuxコマンド入門 #4】

linuxコマンドを連結しより高度に扱うためのパイプやリダイレクトの仕方について紹介するシリーズのサムネイル 5 記事
シリーズ

続・Linuxコマンド入門 ~パイプとリダイレクトを使いこなす~

Linuxコマンドの出力に対して処理してデータを加工したり、処理を自動化する「コマンド結合」の方法について紹介します。

前回は、|(パイプ)と >(リダイレクト)を組み合わせ、cat | grep | wc > file のようにデータを加工・集計・保存する一連の流れを実践しました。

pipe,rideirect,here textを自由に扱えるようになるための解説記事サムネイル

【 | / >】実践!パイプとリダイレクトでデータを加工する【続・Linuxコマンド入門 #3】

パイプ|とリダイレクト>の実践編!cat | grep | wc > file のようにコマンドを繋げてデータを加工・集計・保存する方法を解説。入力リダイレクト<とヒアドキュメント<<も学びます。

これまでの |> が、コマンドが出す「データ(標準出力)」の流れを制御する技術だったのに対し、今回はコマンドの「実行順序」そのものを制御する技術を学びます。

「もしコマンドAが成功したらBを実行」「もしAが失敗したらBを実行」「Aが終わったら(成否に関わらず)Bを実行」といった、処理の自動化(スクリプティング)に欠かせない3つの記号を紹介します。

linuxコマンドのAND OR制御 && や|| ;を自由に扱えるようになるための解説記事サムネイル

イメージ:料理のレシピ

| が「ベルトコンベア(データの流れ)」だとしたら、&& || ; は「料理のレシピ(作業の手順)」に例えられます。

  • ; (Semicolon): 「野菜を切り、皿を準備する」 (前の作業が成功しようが失敗しようが、とにかく順番にやる)
  • && (AND): 「玉ねぎを炒め(成功し)、しんなりしたら、肉を入れる」 (前の作業が成功しないと、次に進めない)
  • || (OR): 「(塩を探し)塩がなかったら(失敗したら)、醤油を使う」 (前の作業が失敗した場合の、代替案)

1. コマンドの動作制御

1. && (AND) — 成功したら、次を実行

&& は、左側のコマンドが「成功」した場合にのみ、右側のコマンドを実行します。 Linuxでは、コマンドが正常に終了することを「成功(終了コード 0)」と呼びます。

[コマンドA] && [コマンドB]

これは、「Aを実行し、Aが成功したら、Bを実行する」という意味になります。

使い方例:バックアップディレクトリ作成

最も代表的な使い方が、ディレクトリの作成とファイルのコピーです。

# (悪い例)もし mkdir が失敗したら(権限がない、など)、cp も失敗する
$ mkdir backup_dir ; cp *.log backup_dir/

# (良い例)mkdir が成功した場合だけ、cp を実行する
$ mkdir backup_dir && cp *.log backup_dir/

&& を使えば、mkdir が失敗した(すでに存在していた、権限がなかった等)場合、cp は実行されないため、無駄なエラーを防げます。


2. || (OR) — 失敗したら、次を実行

||&& の逆で、左側のコマンドが「失敗」した場合にのみ、右側のコマンドを実行します。 Linuxでは、コマンドが異常終了することを「失敗(終了コード 0以外)」と呼びます。

[コマンドA] || [コマンドB]

これは、「Aを実行し、Aが失敗したら、Bを実行する」という意味になります。エラー処理や代替処理に使われます。

使い方例:エラーハンドリング

grep コマンドは、検索対象の文字列が「見つかったら成功(0)」「見つからなかったら失敗(1)」となります。これを利用します。

# sample_log.txt から "CRITICAL" という文字列を探す
# もし見つからなかったら(grepが失敗したら)、"Errors not found" と表示する
$ grep "CRITICAL" sample_log.txt || echo "CRITICAL Errors not found."

もし sample_log.txt に “CRITICAL” が1行もなければ、grep は失敗(1)となり、|| の右側にある echo コマンドが実行されます。


3. ; (Semicolon) — 順番に、とにかく実行

;(セミコロン)は、最も単純です。 左側のコマンドの成功・失敗にかかわらず、とにかく左側が終了したら、次に右側のコマンドを実行します。

[コマンドA] ; [コマンドB]

これは、「Aを実行し、終わったらBを実行する」という、単なる「連続実行」です。

使い方例:連続した作業

複数のコマンドを1行で実行したいだけの場合に使います。

# 画面をきれいにして(clear)、今いる場所を確認して(pwd)、ファイル一覧を表示する(ls -l)
clear ; pwd ; ls -l

clear が成功しようがしまいが pwd が実行され、pwd が成功しようがしまいが ls -l が実行されます。


まとめ

今回は、コマンドの「実行順序」を制御する3つの記号を学びました。 これらは |(パイプ)とは全く違う役割を持つことを理解するのが重要です。

  • ls| (パイプ): データの流れを制御(Aの「出力」をBの「入力」へ)
  • && (AND): 実行順序を制御(Aが成功したらBを実行)
  • || (OR): 実行順序を制御(Aが失敗したらBを実行)
  • ; (セミコロン): 実行順序を制御(Aが終わったら必ずBを実行)

&&|| を使いこなせれば、簡単なエラー処理を含む自動化スクリプトが作れるようになり、初心者から一歩抜け出すことができます。

linuxコマンドを連結しより高度に扱うためのパイプやリダイレクトの仕方について紹介するシリーズのサムネイル

【Linuxコマンド入門 第2部・完】パイプとリダイレクト総まとめ 逆引きリファレンス 【続・Linuxコマンド入門 #5】

続・Linuxコマンド入門シリーズ全4回の総まとめ記事です。シェル演算子の使い方を体系的に知りたい場合やシェル演算子の復習、機能別の逆引きに利用してください。

linuxコマンドを連結しより高度に扱うためのパイプやリダイレクトの仕方について紹介するシリーズのサムネイル 5 記事
シリーズ

続・Linuxコマンド入門 ~パイプとリダイレクトを使いこなす~

Linuxコマンドの出力に対して処理してデータを加工したり、処理を自動化する「コマンド結合」の方法について紹介します。