Shellスクリプト---条件判断
プロシージャシーケンス向け選択実行:if;caseサイクル実行:for;while;untilループには、条件選択実行(条件テスト)条件テスト方式(テスト条件)bashコマンドテストbashコマンドコマンドコマンド実行状態戻り値$:前の実行に使用したコマンドステータスの戻り値0:1-255の正常な実行:失敗exitコマンドを使用して、スクリプトでスクリプトステータスの戻り値をカスタマイズできます.定義しない場合、スクリプトのステータスの戻り値は、スクリプト実行が終了する前の最後の文のステータス例に依存します.
---------------------------------------------------------------------------------------スクリプトで条件判断を完了するには、どの文を実行するかによって、if判定if判定単一分岐if判定if条件then(条件満たす)文fi多分岐if判定if条件then(条件満たす)を用いる文else(条件が満たされていない)文fi練習:user 1,user 2が存在するか否かを判断し、idとshellが出力され、idが作成され出力されない
ネスト:if判断でネストできる他の判断:forサイクルif判断;forループはif判定for i inリストdo if[]をネストすることもできるthen文else文fi done if[$?-eq 0]then for i inリストdo文done else for i inリストdo文done fi---------------------------------------------------------------------------------------------------------------------------------------------------文字テスト;ファイルテスト整数テストexpression:数値1比較子数値2$A比較子$Bが-gt:$A-gt$Bより大きいか、等しい:-ge等しい:-eqが:-ltより小さい小さいか等しい:-leは等しくありません:-ne例:任意の2つの整数、比較サイズ、出力の大きい数値
例:あるIDがシステムユーザか一般ユーザかを判断する
文字テスト(ASCIIテーブルでの2つの文字列の順序を比較し、左から右へ文字単位で比較する)文字列には「」>:より大きい<:より小さい=:等しい=~:左の文字列が右のモードで一致するかどうかを判断する;一般的に[[]]のshell=/bin/bash[[$shell=~sh$]]echo$?=0一般的に行の最初の行の最後のアンカーをして、モードは引用符の例をプラスすることができません:CPUがどんなブランドであることを見て、最後にブランドを出力します
fi例:スクリプトにパラメータを渡し、文字がmemoryまたはMemoryで、メモリ情報を表示し、そうでなければ/proc/uptimeコンテンツを表示する
----------------------------------------------------------単目比較-z$変数:文字列が空であれば真、空でなければ偽-n$変数:空であれば偽、空でなければ真の例:ユーザーのShellがbashであるかどうかを判断し、Shellが空であれば直接終了する'
ファイルテストテスタ:ファイルパス-f:通常のファイルであるかどうかをテストします.すなわち、lsファイルタイプが-のファイル-d:ディレクトリファイルであるかどうかをテストします.-e:テストファイルが存在するかどうかをテストします.存在は真であり、そうでなければ偽-r:使用者がファイルを読めるかどうかをテストする-w:使用者がファイルを書くことができるかどうかをテストする-x:使用者がファイルを実行できるかどうかをテストする-s:ファイルサイズが空でないかどうかをテストする:空でなければ真で、空であれば偽の例:例えば/tmp/testディレクトリが存在しない場合if[!-d/tmp/test]を作成する;then mkdir/tmp/test fi短絡動作(優先度が高いか)の前半で最終結果を決定することができ、後半は演算真&&真=真&&偽=偽&&&{真、偽}=偽または演算偽を許さない[-e/tmp/test]|mkdir/tmp/test前面が真であれば、前面が偽であれば作成しません!id test&>/dev/null&&useradd test||echo「ユーザーは存在する」第1セグメントユーザーが存在しないことを真とし、ユーザーの第1セグメントユーザーの存在を偽とし、後の和は実行されず、前の結果が偽となり、実行または演算-------------------------------------------------------------------bash位置変数:スクリプトの後ろの最初の値を第1のパラメータとして$1を与え、これに従って$1,$2,$3,.....例:ユーザが存在するか否かを判断する
$*,$@:すべての位置パラメータ$#:位置パラメータの個数shift:位置パラメータの交代練習を実現する:パラメータを通じてスクリプトの一連のユーザー名に渡され、存在するスキップ;存在しない追加追加完了統計合計ユーザー数
-------------------------------------------------------------------------------------------------------------------単一オペレータではなく、条件の前にa=3[!$a-eq 0]を置く例:あるユーザのUIDが1より大きく、499以下であるか否かを判断し、同時に2つの条件を満たす必要がある!/bin/bashuid=$(grep "^bb.*bash$"/etc/passwd | cut -d: -f3)if [ $uid -gt 500 -a $uid -le 600 ];then echo「user is system users」fiコマンド組合せテストは、コマンドテストにのみ使用されます&:|:または!:非例:指定されたユーザが存在しない場合、スクリプトifを終了します.id $1 &>/dev/null;then exit 6 fi-------------------------------------------bash条件判断の多分岐if文構文フォーマットif条件1;then文elif条件2;then文fi列サブ:fedora、centosなどのスクリプト文字にパラメータを渡すと、suseのようなRedHatが表示され、opensuseのようにSuSeが表示され、ubuntu、mint、debianのようにDebianが表示されます.そうしないと、他の
if [ $1 -lt $2 ]
then
echo "aa"
get=0
else
echo "bb"
get=9
fi
exit $get
[root@localhost test]# ./1.sh 3 5
aa
[root@localhost test]# echo $?
0
[root@localhost test]# ./1.sh 3 5
aa
[root@localhost test]# echo $?
0
---------------------------------------------------------------------------------------スクリプトで条件判断を完了するには、どの文を実行するかによって、if判定if判定単一分岐if判定if条件then(条件満たす)文fi多分岐if判定if条件then(条件満たす)を用いる文else(条件が満たされていない)文fi練習:user 1,user 2が存在するか否かを判断し、idとshellが出力され、idが作成され出力されない
#!/bin/bash
file=/etc/passwd
for i in user1 user2
do
id $i &> /dev/null
if [ $? = 0 ]
then
grep "^$i" $file | awk -F: '{print $3,$7}'
else
useradd $i
grep "^$i" $file | awk -F: '{print $3}'
fi
done
ネスト:if判断でネストできる他の判断:forサイクルif判断;forループはif判定for i inリストdo if[]をネストすることもできるthen文else文fi done if[$?-eq 0]then for i inリストdo文done else for i inリストdo文done fi---------------------------------------------------------------------------------------------------------------------------------------------------文字テスト;ファイルテスト整数テストexpression:数値1比較子数値2$A比較子$Bが-gt:$A-gt$Bより大きいか、等しい:-ge等しい:-eqが:-ltより小さい小さいか等しい:-leは等しくありません:-ne例:任意の2つの整数、比較サイズ、出力の大きい数値
#!/bin/bash
a=$RANDOM
b=$RANDOM
if [ $a -ge $b ]
then
echo -e "Max Number is A
Number:$a"
else
echo -e "Max Number is B
Number:$b"
fi
例:あるIDがシステムユーザか一般ユーザかを判断する
#!/bin/bash
UserName=user1
if [ $(id -u $UserName) -gt 499 ]
then
echo "Common User:$UserName"
else
echo "Admin User or System User:$UserName"
fi
: user1;user2 UID GID
#!/bin/bash
for i in user1 user2
do
if [ $(id -u $i) -eq $(id -g $i) ]
then
echo "$i good guy"
else
echo "$i bad guy"
fi
done
文字テスト(ASCIIテーブルでの2つの文字列の順序を比較し、左から右へ文字単位で比較する)文字列には「」>:より大きい<:より小さい=:等しい=~:左の文字列が右のモードで一致するかどうかを判断する;一般的に[[]]のshell=/bin/bash[[$shell=~sh$]]echo$?=0一般的に行の最初の行の最後のアンカーをして、モードは引用符の例をプラスすることができません:CPUがどんなブランドであることを見て、最後にブランドを出力します
#!/bin/bash
cpu=$(cat /proc/cpuinfo | grep "vendor" | cut -d: -f2)
if [[ $cpu =~ Intel$ ]];then
echo "cpu is Inter"
else
echo "cpu is AMD"
fi例:スクリプトにパラメータを渡し、文字がmemoryまたはMemoryで、メモリ情報を表示し、そうでなければ/proc/uptimeコンテンツを表示する
#!/bin/bash
if [[ $1 =~ [Mm]emory$ ]];then
free -m
else
cat /proc/uptime
fi
----------------------------------------------------------単目比較-z$変数:文字列が空であれば真、空でなければ偽-n$変数:空であれば偽、空でなければ真の例:ユーザーのShellがbashであるかどうかを判断し、Shellが空であれば直接終了する'
#!/bin/bash
Shell=$(grep "^$1:" /etc/passwd | awk -F: '{print $7}')
if [ -z $Shell ]
then
echo "The user does not exist"
exit 10
fi
if [ "$Shell" == "/bin/bash" ]
then
echo "$1 Shell is BashShell"
Set=0
else
echo "$1 Shell Not BashShell"
Set=9
fi
exit $Set
ファイルテストテスタ:ファイルパス-f:通常のファイルであるかどうかをテストします.すなわち、lsファイルタイプが-のファイル-d:ディレクトリファイルであるかどうかをテストします.-e:テストファイルが存在するかどうかをテストします.存在は真であり、そうでなければ偽-r:使用者がファイルを読めるかどうかをテストする-w:使用者がファイルを書くことができるかどうかをテストする-x:使用者がファイルを実行できるかどうかをテストする-s:ファイルサイズが空でないかどうかをテストする:空でなければ真で、空であれば偽の例:例えば/tmp/testディレクトリが存在しない場合if[!-d/tmp/test]を作成する;then mkdir/tmp/test fi短絡動作(優先度が高いか)の前半で最終結果を決定することができ、後半は演算真&&真=真&&偽=偽&&&{真、偽}=偽または演算偽を許さない[-e/tmp/test]|mkdir/tmp/test前面が真であれば、前面が偽であれば作成しません!id test&>/dev/null&&useradd test||echo「ユーザーは存在する」第1セグメントユーザーが存在しないことを真とし、ユーザーの第1セグメントユーザーの存在を偽とし、後の和は実行されず、前の結果が偽となり、実行または演算-------------------------------------------------------------------bash位置変数:スクリプトの後ろの最初の値を第1のパラメータとして$1を与え、これに従って$1,$2,$3,.....例:ユーザが存在するか否かを判断する
#!/bin/bash
UserName=$1
if id $UserName &> /dev/null
then
echo "$UserName Exists"
else
echo "$userName Not Exists"
fi
[root@localhost test]# ./ifuser.sh user1
user1 Exists
$*,$@:すべての位置パラメータ$#:位置パラメータの個数shift:位置パラメータの交代練習を実現する:パラメータを通じてスクリプトの一連のユーザー名に渡され、存在するスキップ;存在しない追加追加完了統計合計ユーザー数
#!/bin/bash
sum=0
for username in $@
do
if id $username &> /dev/null
then
echo "User $username Exists"
else
useradd $username &> /dev/null
echo "$username" | passwd --stdin $username &> /dev/null
echo -e "User $uesrname Add ok
Passwd:$username
"
sum=$[$sum+1]
fi
done
echo "Add $sum new users"
-------------------------------------------------------------------------------------------------------------------単一オペレータではなく、条件の前にa=3[!$a-eq 0]を置く例:あるユーザのUIDが1より大きく、499以下であるか否かを判断し、同時に2つの条件を満たす必要がある!/bin/bashuid=$(grep "^bb.*bash$"/etc/passwd | cut -d: -f3)if [ $uid -gt 500 -a $uid -le 600 ];then echo「user is system users」fiコマンド組合せテストは、コマンドテストにのみ使用されます&:|:または!:非例:指定されたユーザが存在しない場合、スクリプトifを終了します.id $1 &>/dev/null;then exit 6 fi-------------------------------------------bash条件判断の多分岐if文構文フォーマットif条件1;then文elif条件2;then文fi列サブ:fedora、centosなどのスクリプト文字にパラメータを渡すと、suseのようなRedHatが表示され、opensuseのようにSuSeが表示され、ubuntu、mint、debianのようにDebianが表示されます.そうしないと、他の
#!/bin/bash
if [ $1 = fedora -o $1 = centos ];then
echo "RedHat"
elif [ $1 = suse -o $1 = opensuse ];then
echo "SuSe"
elif [ $1 = ubuntu -o $1 = mint -o $1 = debian ];then
echo "Debian"
else
echo "Unknown"
fi