shellプログラミングの条件文

2674 ワード

Shellプログラミングの条件文


ファイルテストファイルテストとは、指定されたパス名に基づいて、対応するファイルがディレクトリであるか、またはファイルが読み取り可能であるか、書き込み可能であるか、実行可能であるかなどを判断することである.ファイル・テストの一般的なアクション・オプションは、次のとおりです.使用時にテスト・オブジェクトをアクション・オプションの後に配置します.-dディレクトリ(Directory)-eディレクトリまたはファイルが存在するかどうかをテスト-fファイル(File)-r現在のユーザーがRead(Read)を読み取る権限があるかどうかをテスト-w現在のユーザーがWriteに書き込む権限があるかどうかをテスト-xテスト実行可能(Excute)権限が設定されているかどうかをテスト
例:/mnt/cdromディレクトリが存在するかどうかを判断します.
# test -e /mnt/cdrom
# echo $?
0

testコマンドでは、ファイルを判断するための選択肢が多く、ファイル数から単一ファイルの判断と2つのファイルの比較に分けられます.ここで、1つのファイルを判断する最も一般的な選択肢は-fであり、2つのファイルを比較する際によく使われる選択肢は、-nt判断ファイルAがファイルBより新しいか-ot判断ファイルAがファイルBより古いか-ef判断2つのファイルが同じファイルであるかどうかを判断し、2つのファイルが同じinodeに向けられているかどうかを判断するための例である.
#touch a
#touch b
#test a -ot b&&echo “YES”
|| echo “NO”
#[ a -ot b ]&&echo “YES”
|| echo “NO”
#test a -ef b &&echo “YES”
|| echo “NO”
#ln a c
#test a -ef c &&echo “YES”
|| echo “NO”

整数値比較整数値比較とは、与えられた2つの整数値に基づいて、第1の数と第2の数との関係、例えば、第2の数より大きい、等しい、より小さいか否かを判断することを指す.整数値比較の一般的な動作オプションは、-eq aがb-ne aに等しくないb-gt aがb-ltaより大きいb-le aに等しいb-ge aに等しいbに等しい例:現在登録されているユーザ数を判断し、5個を超えると「Too many」を出力する
# Unum=`who|wc -l`
# [ $Unum -gt 5 ]&&echo "too many."
too many.


文字列比較文字列比較は、通常、ユーザ入力、システム環境変数などが条件を満たしているかどうかを確認するために使用され、インタラクティブな操作を提供するshellスクリプトでは、ユーザ入力の位置パラメータが要求に合致しているかどうかを判断するためにも使用されます.文字列比較でよく使用されるアクションオプションは次のとおりです:=1番目の文字列は2番目の文字列と同じです!=1番目の文字列は2番目の文字列とは異なる-zチェック文字列は空(zero)であり、未定義または空の値を付与変数は空列の例と見なされる:現在のシステムの言語環境を判断し、enではない.US時出力「Not en.US」
# echo $LANG
zh_CN.UTF-8
# [ $LANG != "en.US" ]&&echo "Not en.US"
Not en.US

if文構造


単一ブランチのif文は、条件が成立した場合にのみ対応するコードを実行します.そうしないと、アクションは実行されません.構文フォーマット:if条件テスト文thenコマンドシーケンスfi
例:shellスクリプトを使用してCDをマウントし、永続的にマウントする
#!/bin/bash
MOUNT_DIR="/mnt/cdrom"
if [ ! -d $MOUNT_DIR]
then
  mkdir -p $MOUNT_DIR
  mount /dev/sr0 $MOUNT_DIR
else
  echo -e "\033[31m /dev/sr0 mounted on /mnt/cdrom!\033[0m"
fi
# chmod +x moutcd.sh 
# ./moutcd.sh

二重分岐のif文は,条件成立と条件不成立の2つの場合にそれぞれ異なる操作を実行する.構文フォーマット:if条件テスト文thenコマンドシーケンス1 elseコマンドシーケンス2 fi
例:shellスクリプトを使用してホストが開いているかどうかをテストします.
#!/bin/bash
ping -c 3 -i 0.2 -w 3 $1 &>/dev/null
if [ $? -eq 0 ]
then
  echo "Host $1 is up!"
else
  echo "Host $1 is down!"
fi
  # ./pinghost.sh 192.168.75.1
Host 192.168.75.1 is up!

マルチブランチのif文は,単一ブランチ,二重ブランチのif文に比べて,マルチブランチif文の実用化は多くない.if文はテスト結果の成立,不成立に応じてそれぞれ操作を実行できるため,ネストして使用し,複数回の判断を行うことができる.構文フォーマット:if条件テスト操作1 thenコマンドシーケンス1 elif条件テスト操作2 thenコマンドシーケンス2 elesコマンドシーケンス3 fi