Shellスクリプトtestコマンド大全、プロセス制御文および関数の応用
5414 ワード
testテストコマンド大全、範囲:整数テスト、文字列テスト、ファイルテスト.
整数テスト
文字列テスト
ファイルテスト
注意:通常testコマンドは単独ではなくif文と連用されます.
プロセス制御文
一、if-else分岐構造
if構文フォーマット:
if条件
then
論理ブロック(通常はコマンド)
fi
1行書き:端末の書き方に適用:
if条件;thenロジック;fi
if-else構文フォーマット:
if条件
then
論理ブロック(通常はコマンド)
else
ろんりブロック
fi
if else-if else構文フォーマット:
if条件1
then
論理ブロック(通常はコマンド)
Elif条件2
then
ろんりブロック
else
ろんりブロック
fi
ブランチ構造はネストすることもできます.複数の条件が結合されている場合は、次のオプションがあります.
-a:論理と2つの条件が成立した場合、結果はtrue
-o:論理または2つの条件が1つ成立すればtrueとなる
二、case多選択文
case文は値とパターンを一致させ、一致に成功し、対応する論理ブロックを実行します.
構文:
ケース値in
モード1)
ろんりブロック
;;
モード2)
ろんりブロック
;;
esac
三、for循環構造
書式:
for変数in名前テーブル
do
ろんり
done
1行に書きます.
for変数inリスト;doロジック;done;
四、selectフォームループ
構文:
select変数inリスト
do
ろんりブロック
done
selectとforループの違いは、selectが出力されると、出力オブジェクトの前にシーケンスがあることです.
五、whileサイクル
構文:
while条件
do
ろんりブロック
done
六、無限循環
構文:
while :
do
ろんりブロック
done
または
while true
do
ろんりブロック
done
七、untilサイクル
untilループが論理trueに実行されたときに停止
構文:
until条件
do
ろんりブロック
done
八、breakとcontinue
ループを早期に終了したい場合(すなわちループから飛び出したい場合)はキーワードbreakを使用します
次のループを終了したい場合は、キーワードcontinueを使用します.
九、shift指令
役割:パラメータを左に移動し、実行するたびに、パラメータシーケンスを順次左に移動し、$#の値を1つ少なくし、多くの場合、各パラメータを個別に処理するために使用され、移動したパラメータは使用できません.
関数の適用
一、基礎
shellスクリプトでは、関数を定義したり、論理をカプセル化したり、呼び出したりすることもできます.
構文:
[function] functionName(){
ろんり
}
呼び出すときは、()を持たずにfunctionNameを直接書けばいいです.
説明:1、キーワードfunctionは書かなくてもいいです.2、returnキーワード、プラスしてもプラスしなくても、需要を見ます.加算すると、戻り値は0-255の数字しかありません.追加しない場合は、最後のコマンドの結果を戻り値とします.
入出力リダイレクト:
通常、システムコマンドは、端末から入力データを受信し、出力する情報を端末に送信します.入力する位置を指定したり、出力する位置を指定したりする必要がある場合があります.これが「リダイレクト」の概念です.リダイレクトコマンド
説明
command > file
出力をfileにリダイレクト
command < file
入力をfileにリダイレクト
command>>file出力を追加でfileにリダイレクト
shellファイルは外部スクリプトを導入します.
コンセプト:Shellスクリプトの内部では、他の外部スクリプトを参照することもできます.これにより、独立したファイルとして共通のコードを簡単にカプセル化できます.Shellスクリプトは外部スクリプトの構文を以下のように参照する. fileName # .ファイルとの間には必ずスペースや
source fileName
Shellスクリプトデバッグ:
1、sh-x scriptスクリプトを実行し、すべての変数の値を表示します2、sh-n scriptスクリプトを実行しないで文法をチェックするモードで、すべての構文エラーを返します
整数テスト
test v1 -eq v2 #
test v1 -gt v2 # v1>v2
test v1 -ge v2 # v1>=v2
test v1 -lt v2 # v1
文字列テスト
test str1=str2 #
test str1!=str2 #
test str1 #
test -n str1 #
test -z str1 #
ファイルテスト
test -d file #
test -f file #
test -x file #
test -r file #
test -w file #
test -a file #
test -s file # 0
注意:通常testコマンドは単独ではなくif文と連用されます.
プロセス制御文
一、if-else分岐構造
if構文フォーマット:
if条件
then
論理ブロック(通常はコマンド)
fi
1行書き:端末の書き方に適用:
if条件;thenロジック;fi
if-else構文フォーマット:
if条件
then
論理ブロック(通常はコマンド)
else
ろんりブロック
fi
# 1: , 50, 1; , 0
read -p " " num
if test $num -gt 50
then echo "1"
else echo "0"
fi
if else-if else構文フォーマット:
if条件1
then
論理ブロック(通常はコマンド)
Elif条件2
then
ろんりブロック
else
ろんりブロック
fi
# 2: , 90, “A”; 80, “B”; 70, “C”; , “D”;
read -p " " sc
if [ $sc -ge 90 ] #test , []
then echo "A"
elif [ $sc -ge 80 ]
then echo "B"
elif [ $sc -ge 70 ]
then echo "C"
else echo "D"
fi
ブランチ構造はネストすることもできます.複数の条件が結合されている場合は、次のオプションがあります.
-a:論理と2つの条件が成立した場合、結果はtrue
-o:論理または2つの条件が1つ成立すればtrueとなる
# 3: a,b, a>=b a , a-b ; a
二、case多選択文
case文は値とパターンを一致させ、一致に成功し、対応する論理ブロックを実行します.
構文:
ケース値in
モード1)
ろんりブロック
;;
モード2)
ろんりブロック
;;
esac
# 2
read -p " " sc
nu=0
if [ $sc -ge 90 ] #test , []
then nu=1
elif [ $sc -ge 80 ]
then nu=2
elif [ $sc -ge 70 ]
then nu=3
else nu=4
fi
case $nu in
1) echo "A";;
2) echo "B";;
3) echo "C";;
4) echo "D";;
esac
三、for循環構造
書式:
for変数in名前テーブル
do
ろんり
done
1行に書きます.
for変数inリスト;doロジック;done;
# : 1-10
for num in {1..10}
do echo "num:$num"
done
#
for num in {1..10};do echo "$num";done;
四、selectフォームループ
構文:
select変数inリスト
do
ろんりブロック
done
# : 1-10
select num in {1..10}
do echo "num:$num"
done
#
select num in {1..10};do echo "$num";done;
selectとforループの違いは、selectが出力されると、出力オブジェクトの前にシーケンスがあることです.
五、whileサイクル
構文:
while条件
do
ろんりブロック
done
# : 1-10
w=1
while [ $w -le 10 ]
do echo "$w"
w=$[$w+1]
done
六、無限循環
構文:
while :
do
ろんりブロック
done
または
while true
do
ろんりブロック
done
七、untilサイクル
untilループが論理trueに実行されたときに停止
構文:
until条件
do
ろんりブロック
done
#---until
# 1 100 , >100
num=1
sum=0
until test $num -gt 100
do
sum=$[sum+num]
num=$[num+1]
done
echo "1-100 :$sum"
八、breakとcontinue
ループを早期に終了したい場合(すなわちループから飛び出したい場合)はキーワードbreakを使用します
次のループを終了したい場合は、キーワードcontinueを使用します.
# 1: 100 ”hello shell“, 50 ,
i=1
while [ $i -le 100 ]
do
echo " $i :hello world"
i=$[i+1]
if test $i -gt 50
then
break
fi
done
# 2: ,
read -p " " num
temp=$[num/2]
i=2
flag=0
while [ $i -le $temp ]
do
if test $[num%i] -eq 0
then flag=1
fi
i=$[i+1]
done
if test $flag -eq 0
then echo "$num "
elif test $flag -eq 1
then echo "$num "
fi
# 3: 1 100 , 25 50 75
sum=0
for i in {1..100}
do
if [ $i -eq 25 -o $i -eq 50 -o $i -eq 75 ]
then continue
fi
sum=`expr $sum + $i`
done
echo "$sum"
九、shift指令
役割:パラメータを左に移動し、実行するたびに、パラメータシーケンスを順次左に移動し、$#の値を1つ少なくし、多くの場合、各パラメータを個別に処理するために使用され、移動したパラメータは使用できません.
# , , " "
# ,
sum=0
if [ $# -ne 0 ]
then
echo " :$#"
while [ $# -gt 0 ]
do
sum=$[$sum + $1]
shift
done
echo " :$sum"
else
echo " "
fi
#
./file.sh 1 2 3 4 5
#
:5
:15
関数の適用
一、基礎
shellスクリプトでは、関数を定義したり、論理をカプセル化したり、呼び出したりすることもできます.
構文:
[function] functionName(){
ろんり
}
呼び出すときは、()を持たずにfunctionNameを直接書けばいいです.
# : 1-100
sum=0
function sum(){
for i in {1..100}
do
sum=`expr $sum + $i`
done
echo "1-100 :$sum"
}
sum
説明:1、キーワードfunctionは書かなくてもいいです.2、returnキーワード、プラスしてもプラスしなくても、需要を見ます.加算すると、戻り値は0-255の数字しかありません.追加しない場合は、最後のコマンドの結果を戻り値とします.
# : 1-100
a=0
function num(){
for b in {1..100}
do
a=$[a+b]
done
return $a
}
num
result=$?
echo "result:$result"
入出力リダイレクト:
通常、システムコマンドは、端末から入力データを受信し、出力する情報を端末に送信します.入力する位置を指定したり、出力する位置を指定したりする必要がある場合があります.これが「リダイレクト」の概念です.リダイレクトコマンド
説明
command > file
出力をfileにリダイレクト
command < file
入力をfileにリダイレクト
command>>file出力を追加でfileにリダイレクト
shellファイルは外部スクリプトを導入します.
コンセプト:Shellスクリプトの内部では、他の外部スクリプトを参照することもできます.これにより、独立したファイルとして共通のコードを簡単にカプセル化できます.Shellスクリプトは外部スクリプトの構文を以下のように参照する. fileName # .ファイルとの間には必ずスペースや
source fileName
Shellスクリプトデバッグ:
1、sh-x scriptスクリプトを実行し、すべての変数の値を表示します2、sh-n scriptスクリプトを実行しないで文法をチェックするモードで、すべての構文エラーを返します