3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(Linux)コマンドを連結して行う「;」「&」「&&」「||」の違い

シェルスクリプトにおいて、複数のコマンドを連結して処理するときに、「;」「&」「&&」「||」が使えるですんが、それぞれがどのような動きするかまとめてみました。

;(セミコロン)

前のコマンドが終わり次第、次のコマンドが実行される。(3つ以上のコマンドを連結してOKみたい)

#command1 を実行し、実行後 command2 を実行する。

command1 ; command2

&(アンパサンド)

;(セミコロン)は前のコマンドの完了を待っていたが、&は待たない。

#command1 を実行しながら、command2 を実行する。

command1 & command2

&&

前のコマンドがうまく終了した(終了ステータスが0)なら、次のコマンドを実行。そうでないなら次のコマンドは実行しない。

#command1 が 0 を返した場合、command2 を実行

command1 && command2

例:

#configureが成功したらmake,makeが成功したらmake installする

configure && make && make install

#/home/a.txtがあれば cp コマンドでコピーする

[ -f /home/a.txt ] && cp /home/a.txt /var/bkup

↑のように、テストコマンドの戻り値も使うことができる。

こうすることで、if文の行数を減らせるかもしれない。

if文だと下記のようになる。

if [ -f /home/a.txt ] then

cp /home/a.txt /var/bkup

if

||

&&とは逆で前のコマンドに失敗(終了コード0以外)したら、次のコマンドを実行する。

#command1 が 0 以外を返した場合、command2 を実行

command1 || command2

例:

#command1が失敗したら指定したディレクトリ削除

command1 || rm -rf /home/hoge/tmp

参考:

最低限 UNIX / Linux [III] 【シェルスクリプト】

UNIXの部屋 コマンド検索:シェル記号類まとめ (*BSD/Linux)

PC UNIXの起動と起動ファイルの解読@謎の処理系 SunOS 4.1.4 with Linux/FreeBSD