Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

Bash条件式の実例6選!-e・-eq・-z・!=・[・[[ の使い方を徹底解説

Bashにおける「条件式」とは、演算子・関数・値を組み合わせて条件分岐文を構成するための式のことです。条件式には、数値や文字列、あるいは成功時に終了ステータス0を返すコマンドなどを扱う単項式や二項式があります。

ファイルの状態をテストするための条件式は数多く用意されています。ここでは、特に役立つ代表的な条件式を紹介します。

  • [ -e ファイルパス ] … ファイルが存在する場合に真を返します。
  • [ -x ファイルパス ] … ファイルが存在し、かつ実行可能な場合に真を返します。
  • [ -S ファイルパス ] … ファイルが存在し、かつソケットファイルである場合に真を返します。
  • [ 式1 -a 式2 ] … 式1と式2の両方が真の場合に真を返します(AND)。
  • [ 式1 -o 式2 ] … 式1または式2のどちらかが真の場合に真を返します(OR)。

ファイル・文字列・数値を判定するその他の条件式については、bashのmanページを参照してください。

Bash実例1:ファイルの存在確認

次のシェルスクリプトは、絶対パス付きのファイル名を受け取り、そのファイルが存在するかどうかをチェックして、結果に応じたメッセージを表示します。

$ cat exist.sh
#! /bin/bash
file=$1
if [ -e $file ]
then
	echo -e "File $file exists"
else
	echo -e "File $file doesnt exists"
fi

$ ./exist.sh /usr/bin/boot.ini
File /usr/bin/boot.ini exists

if文のさまざまな書き方については、過去のBash if文解説記事も参考にしてください。

Bash実例2:数値の比較

次のスクリプトは、ユーザーから2つの整数を読み込み、両者が等しいか、どちらが大きいか・小さいかを判定します。

$ cat numbers.sh
#!/bin/bash
echo "Please enter first number"
read first
echo "Please enter second number"
read second

if [ $first -eq 0 ] && [ $second -eq 0 ]
then
	echo "Num1 and Num2 are zero"
elif [ $first -eq $second ]
then
	echo "Both Values are equal"
elif [ $first -gt $second ]
then
	echo "$first is greater than $second"
else
	echo "$first is lesser than $second"
fi

$ ./numbers.sh
Please enter first number
1
Please enter second number
1
Both Values are equal

$ ./numbers.sh
Please enter first number
3
Please enter second number
12
3 is lesser than 12

Bashスクリプティングが初めての方は、まずBash入門チュートリアルから読むことをおすすめします。

Bash実例3:簡単な四則演算電卓

この例では、変数inp1とinp2に対して実行したい算術演算(加算・減算・乗算)の種類を入力として受け取り、対応する計算結果を表示します。

$ cat calculator.sh
#!/bin/bash
inp1=12
inp2=11
echo "1. Addition"
echo "2. Subtraction"
echo "3. Multiplication"
echo -n "Please choose a word [1,2 or 3]? "
read oper

if [ $oper -eq 1 ]
then
	echo "Addition Result " $(($inp1 + $inp2))
else
	if [ $oper -eq 2 ]
	then
		echo "Subtraction Result " $(($inp1 - $inp2))
	else
		if [ $oper -eq 3 ]
		then
			echo "Multiplication Result " $(($inp1 * $inp2))
		else
			echo "Invalid input"
		fi
	fi
fi

$ ./calculator.sh
1. Addition
2. Subtraction
3. Multiplication
Please choose a word [1,2 or 3]? 4
Invalid input

特殊パラメータ($*、$@、$#、$$、$!、$?、$-、$_)の使い方をマスターすると、スクリプト作成の効率が大きく向上します。

Bash実例4:IPアドレスの読み込みとping疎通確認

次のスクリプトはIPアドレスを入力として受け取り、そのホストが到達可能かどうかをpingで確認して、結果に応じたメッセージを表示します。

$ cat ipaddr.sh
#!/bin/bash
echo "Enter the Ipaddress"
read ip

if [ ! -z $ip ]
then
	ping -c 1 $ip
	if [ $? -eq 0 ] ; then
		echo "Machine is giving ping response"
	else
		echo "Machine is not pinging"
	fi
else
	echo "IP Address is empty"
fi

$ ./ipaddr.sh
Enter the Ipaddress
10.176.191.106

Pinging 10.176.191.106 with 32 bytes of data:

Reply from 10.176.191.106: bytes=32 time<1ms TTL=128

Ping statistics for 10.176.191.106:
    Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms
Machine is giving ping response

この例では、-zは文字列の長さが0(空)の場合に真を返します。条件の直前に!(否定)演算子を付けているため、式が偽のとき、つまりIPアドレスが空でない場合にifブロック内の処理が実行され、pingによる到達性の確認へと進みます。

Bash実例5:インストーラースクリプト

多くのパッケージのインストーラースクリプトは、rootユーザーでの実行を許可していません。スクリプト側で実行ユーザーをチェックし、不正な実行に対してエラーを返すようにしておきましょう。

次のスクリプトは、実行ユーザーがroot以外の場合にのみ、Oracleのインストーラースクリプトを実行できるようにする例です。

$ cat preinstaller.sh
#!/bin/bash
if [ `whoami` != 'root' ]; then
	echo "Executing the installer script"
	./home/oracle/databases/runInstaller.sh
else
	echo "Root is not allowed to execute the installer script"
fi

Executing the script as a root user,
# ./preinstaller.sh
Root is not allowed to execute the installer script

この例では、whoamiコマンドの出力と「root」という文字列を比較しています。文字列比較には==!=<などを、数値比較には-eq-ne-lt-gtを使うのが基本です。

Bash実例6:拡張ブラケット [[ ]]

これまでの例では、条件式を囲むのに角括弧を1組だけ使ってきましたが、Bashでは二重角括弧[[ ]]も使えます。これは単一括弧構文の拡張版にあたるものです。

$ cat enhanced.sh
#!/bin/bash
echo "Enter the string"
read str
if [[ $str == *condition* ]]
then
	echo "String "$str has the word \"condition\"
fi

$ ./enhanced.sh
Enter the string
conditionalstatement
String conditionalstatement has the word "condition"
  • [はtestコマンドの同義語です。シェルに組み込まれていますが、動作時には新しいプロセスを生成します。
  • [[はその改良版で、プログラムではなくキーワードとして扱われます。
  • [[はKornシェルとBashで利用できます。
  • 上記の例では、変数$strのどこかに「condition」という語が含まれていれば条件は真になります。
  • これはシェルのグロブ機能であり、[[(二重括弧)を使った場合のみサポートされるため、多くの引数をクォートで囲む必要がありません。
  1. rbashとは?実例でわかる制限付きBashシェルの仕組みと使い方

    Linuxシェルは、GNU/Linux環境における最も強力で魅力的なツールのひとつです。X Window Systemをはじめとするすべてのアプリケーションはシェルを基盤として動作しており、Linuxシェルを使えばシステム全体を精密に制御できます。しかし一方で、コマンドの影響を理解せずに実行してしまうと、システムに深刻な被害をもたらす危険性も秘めています。 特に初心者ユーザーにとって、誤操作によるトラブルは大きなリスクです。そこで役立つのが「制限付きシェル」です。本記事では、rbash(制限付きBash)の概要から、実際に適用される制限内容、有効化の手順、メリット・デメリットまで詳しく解説しま

  2. Bashシェル関数入門:実用的な6つのサンプル例で学ぶチュートリアル

    Bashシェル関数とは、複数のUNIX/Linuxコマンドをひとつの名前でグループ化し、後からまとめて実行できるようにする仕組みです。Bashシェル関数は通常のUnixコマンドと同じように呼び出すことができ、現在のシェルコンテキスト内で実行されるため、解釈用の新しいプロセスを生成する必要がありません。bashのエイリアス(alias)と関数はどちらも、長いコマンドや複雑なコマンドに対するショートカットを定義するのに役立ちます。しかし、エイリアスでは制御フローや引数の扱いなど、関数ならではの高度な処理を行うことはできません。本記事では、その違いも含めて詳しく解説していきます。この記事は、進行中の