[bash]制御演算子と1ライナー化

bash

膨大な作業の時って手順作ったり、実作業の時に少しでも手数減らしたくないですか?
自分は少しでも楽したいほうなのですが、そんな時によく使ってるコマンドをまとめて見ました。

1. 基本の構文

1ライナーで繋ぐ時に使う色々な制御演算子と呼ぶのかな?(正式名称不明)をまずは改めて説明します。

記号説明
;コマンドを順番に実行
|コマンドの結果を後ろのコマンドに渡す
&バックグラウンドで実行
&&前のコマンドが成功した場合に次を実行
||前のコマンドが失敗した場合に次を実行

1.1. 「;」 コマンドを順番に実行

  • 各コマンドを独立して順番に実行します。
  • 前のコマンドの成否に関係なく次のコマンドを実行します。
■ 書式
$ command1; command2; command3

■ コマンド例
$ echo "Hello"; echo "World"; ls

echo "Hello"が成功しても失敗しても、次のecho "World"を実行。その後にlsを実行。

1.2. 「|」 コマンドの結果を渡す

  • 前のコマンドの結果を後ろのコマンドに渡します。
■ 書式
$ command1 | command2

■ コマンド例
$ ps -ef | grep system

プロセス一覧を取得し(ps -ef)、その結果から「system」を含むものを検索(grep system)します。

1.3. 「&」バックグラウンド実行

  • 「&」前のコマンドをバックグラウンドで実行し、後ろのコマンドを即実行します。
■ 書式
$ command1 & command2

■ コマンド例
$ sleep 10 & echo "Task running"

sleep 10をバックグラウンドで実行し、直後にecho で”Tast running”を返します。
バックグラウンド実行しているジョブを確認する時は「jobs」コマンドで確認します。

■ 参考
$ sleep 10 & echo sleep10
[1] 1463199
sleep10

$ jobs
[1]+ 実行中 sleep 10 &

1.4. 「&&」: 前のコマンドが成功した場合に次を実行

  • 前のコマンドが成功(終了ステータスが0)した場合のみ次のコマンドを実行します。
■ 書式
$ command1 && command2

■ コマンド例
$ mkdir test_dir && cd test_dir

mkdir test_dirが成功したらcd test_dirを実行し、cd test_dirで移動します。

1.5. 「||」: 前のコマンドが失敗した場合に次を実

前のコマンドが失敗(終了ステータスが非0)した場合のみ次のコマンドを実行します。

■ 書式
$ command1 || command2

■ コマンド例
$ cd test_dir || echo "Directory does not exist"

cd test_dir が失敗した場合にecho "Directory does not exist"を実行します。


利用例

mountの確認、mountの有無でmount/umount

環境によって、「作業領域は通常unmountされていて、作業時にmountして利用すること」みたいな時に一々確認→mountが面倒だったので使ってました。

■ 構文
# mountpoint -q <path> || mount <path>

■ コマンド例
# mountpoint -q /mnt/data || mount -t nfs nfs.example.com:/data /mnt/data

mountpointコマンドを -q オプションで実行すると標準出力なしで実行されます。
マウントされていると終了コード「0」が返る。
マウントされていないと終了コード「1」が返る。
ので、「||」(終了コードが0以外の場合実行)で繋げてmountコマンドを実行させます。

逆にマウントしていたらアンマウントさせたりも。

■ 構文
# mountpoint -q <path> && mount <path>

■ コマンド例
# mountpoint -q /mnt/data && umount /mnt/data

サービスが起動していなかったら起動/起動してたら停止

systemctlで任意のサービスが起動していなかったら起動させる(またはその逆)時に使ってます。

【起動していない場合起動させる】
■ 構文
# systemctl is-active --quiet <service名> || systemctl start <service名>
■ コマンド例
# systemctl is-active --quiet iscsi.service || systemctl start iscsi.service

【起動している場合停止させる】
■ 構文
# systemctl is-active --quiet <service名> && systemctl stop <service名>
■ コマンド例
# systemctl is-active --quiet iscsi.service && systemctl stop iscsi.service

systemctl is-activeでアクティブかどうかを判断。–quietで出力を抑止して、終了コードで起動・停止を制御させています。

コメント

タイトルとURLをコピーしました