1-23-条件テスト文とifプロセス制御文の使用
4842 ワード
:2018-06-16
:
一、変数テスト文
testテストコマンド
testコマンドを使用して、変数のテストを行います.結果が正しければ、結果を真とも呼び、$?=0は、逆に偽を表し、$?=1が表示されます.
パラメータ
説明
例
-eファイル名
ファイルが存在するかどうか、存在するかどうかtest -e my_test.txt
-rファイル名
ファイルが読めるかどうか、真に読めるかどうかtest -r my_test.txt
-wファイル名
ファイルが書けるかどうか、本物と書くことができますtest -w my_test.txt
-xファイル名
ファイルが実行可能かどうか、実行可能かどうかtest -x my_test.txt
-sファイル名
ファイルに文字があるかどうか、真があるかどうかtest -s my_test.txt
-dファイル名
ファイルがディレクトリかどうか、真かどうかtest -d my_test.txt
-fファイル名
ファイルが通常のファイルかどうかは、真です.test -f my_test.txt
-cファイル名
ファイルが文字型特殊ファイルであるかどうかは、真であるtest -c my_test.txt
-bファイル名
ファイルがブロック特殊ファイルかどうかは、真です.test -b my_test.txt
注意:ファイルは存在しなければなりません.存在しないのは偽です.$?=1. 例:#
test -e my_test.txt
#
echo $?
数値サイズ比較
パラメータ
説明
-eq
に等しい
-ne
等しくない
-gt
より大きい
-ge
以上
-lt
より小さい
-le
以下
例:# 5 4
test 5 -eq 4
#
echo $?
文字列の比較
パラメータ
説明
=
真に等しい
!=
等しくなければ真である
-z文字列
文字列の長さがゼロの場合は真
-n文字列
文字列の長さがゼロでない場合は真
例:str1=abc
str2=abcd
test $str1 = $str2
echo $?
test $str1 == $str2
echo $?
test $str1 != $str2
echo $?
test -z $str1
echo $?
testテスト文のもう一つの一般的な使用方法
[ ]
のカッコを使用してtestというコマンドを表します.例えば、[ -d /etc ]
は/etcがディレクトリであるかどうかを判断し、test -d /etc
というコマンドに相当します.[ ]
のカッコを使用して、数値比較では通常の数学記号を使用して数値サイズを比較したり、-eq、-ne、-gtなどの文字を使用したりすることができます.
文字表示
シンボル代替表示
-eq
==等しい
-ne
!= 等しくない
-gt
>より大きい
-lt
未満[ ]
の代替testコマンドを使用するには、いくつかの点に注意してください.
#
test -e my_test.txt
#
echo $?
# 5 4
test 5 -eq 4
#
echo $?
str1=abc
str2=abcd
test $str1 = $str2
echo $?
test $str1 == $str2
echo $?
test $str1 != $str2
echo $?
test -z $str1
echo $?
[ -d /etc ]
は正しいですが、[-d /etc]
は正しくありません.[ 9 == 4 ]
は正しいですが、[ 9==4 ]
は正しくありません.[ 9 \< 4 ]
が正しく、[ 9 < 4 ]
が正しくありません.エスケープ文字を使用しない場合は、[[ 9 < 4 ]]
を使用できます.次の特性を理解する必要があります.
[ ]
式において、一般的な>、[[ ]]
演算子は[ ]
演算子の拡張にすぎず、エスケープ子を必要とせずに<、>シンボル演算をサポートすることができる.論理演算子|,&&は-a,-oを使用しません.[[ ]]
は正則を用いることができるが、[ ]
はだめである.例えば、# false,*.html , *
[ "a.html" == *.html ] && echo true || echo false
# ture,*
[[ "a.html" == *.html ]] && echo true || echo false
# ,* ,
[[ "a.html" == "*.html" ]] && echo true || echo false
論理と(&)と論理または(|)
論理と(&):論理と、
-a
で表すことができます([[ ]]
の中に括弧がある場合、-aで表すことはできません&&).例えば:[ -f /etc/passwd ] && [ -w /etc/passwd ]
.論理または(|):
-o
で表すことができます([[ ]]
の中に二重中括弧がある場合、-oで表すことはできません|).例えば:[ -f /etc/passwd ] || [ -w /etc/passwd ]
.条件判断では、論理和を用いて、以下の3つの書き方を用いることができる.
if [ ] && [ ]; then
fi
if [[ && ]]; then
fi
if [ -a ]; then
fi
論理と論理または、次のような用途があります.
[ 1 -lt 2 -a 5 > 3 ] && echo true || echo false
上記の文は、
[ 1 -lt 2 -a 5 > 3 ]
が真の場合、echo true
を実行し、偽の場合、echo false
を実行します.二、プロセス制御--if文
単一ブランチif文
構文の形式:if 1 ; then
1
fi
例:#!/bin/bash
if [ $USER != root ]
then
echo "error: not root user, permission demain."
exit 127 #
fi
thenとifを同じ行に置くこともできます.#!/bin/bash
if [ $USER != root ]; then
echo "error: not root user, permission demain."
exit 127 #
fi
ダブルブランチif文
構文の形式:if 1 ; then
1
else
2
fi
例えば、pingテストIPのスクリプトを書いて、pingが通じるかどうかを見てみましょう.#!/bin/bash
# Unix ,/dev/null, ,
# ,
# ( ),
# EOF。
ping -c 3 -i 0.2 $1 > /dev/null
if [ $? -eq 0 ]; then
echo "HOST $1 is up"
else
echo "HOST $1 is down"
fi
マルチブランチif文
構文の形式:if 1 ; then
1
elif 2 ; then
2:
elif 3 ; then
3
else
n
fi
例:#!/bin/bash
m=man
w=woman
read -p " :" sex
if [ $sex == $m ]; then
echo " 。"
elif [ $sex == $w ]; then
echo " 。"
else
echo " 。"
fi
if 1 ; then
1
fi
#!/bin/bash
if [ $USER != root ]
then
echo "error: not root user, permission demain."
exit 127 #
fi
#!/bin/bash
if [ $USER != root ]; then
echo "error: not root user, permission demain."
exit 127 #
fi
if 1 ; then
1
else
2
fi
#!/bin/bash
# Unix ,/dev/null, ,
# ,
# ( ),
# EOF。
ping -c 3 -i 0.2 $1 > /dev/null
if [ $? -eq 0 ]; then
echo "HOST $1 is up"
else
echo "HOST $1 is down"
fi
if 1 ; then
1
elif 2 ; then
2:
elif 3 ; then
3
else
n
fi
#!/bin/bash
m=man
w=woman
read -p " :" sex
if [ $sex == $m ]; then
echo " 。"
elif [ $sex == $w ]; then
echo " 。"
else
echo " 。"
fi