1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

シェルスクリプトのクイックスタート - 条件文とループ

2022-02-08 06:28:27

皆さんはすでにシェルスクリプトについて少し知っていて、シェルスクリプトの条件文に期待しているのではないでしょうか。今回のブログでは、シェルの条件文とループについて説明しましょう。

1. 条件付き判定

1.1 基本的な構文

条件

注意事項

  • 条件の前後には空白を入れる必要があります
  • 条件が空でない場合、[atguigu]はtrueを返し、[]はfalseを返します。

1.2. よく使われる判定条件

(1) 2つの整数を比較する=文字列比較

  • -lt less than (以下) -le less than equal (以下等)
  • -eq よりも等しい -gt よりも大きい
  • -ge 等しいより大きい -ne 等しくない

(2) ファイルパーミッションによる判定

  • 読み取り権限を持つ -r (読み取り)
  • -w は書き込み可能(write)です。
  • -x 実行権限を持つ (実行)

(3) ファイルタイプによる判定

  • -f ファイルが存在し、かつ通常のファイル(file)である。
  • -e ファイルが存在する(existence)
  • -d ファイルが存在し、ディレクトリである

1.3. 事例紹介

23 は 22 より大きいか、または 22 と等しいか $?を使って結果が真かどうかを確認する 0 を返す

[root@node01 shell]# [ 23 -ge 22 ]
[root@node01 shell]# echo $?
0

ファイル固有のパーミッションを表示する $? trueの場合は0を返します。

[root@node01 shell]# [ -w helloword.sh ]
[root@node01 shell]# echo $?
0

ディレクトリにファイルが存在するかどうかを $? 真の場合は0を返します

[root@node01 shell]# [ -e /opt/shell/aa.txt ] -- does not exist
[root@node01 shell]# echo $?
1
[root@node01 shell]# [ -e /opt/shell/helloword.sh ]
[root@node01 shell]# echo $?
0



多条件判定(&&は前のコマンドが成功してから次のコマンドが実行されること、||は前のコマンドが失敗してから次のコマンドが実行されることを意味します。)

[root@node01 shell]# [ condition ] && echo ok || echo notOK
ok
[root@node01 shell]# [ condition ] && [ ] ||echo notOk
notOk

1.4. 判断の場合

1.4.1 基本的な構文

if [conditional];then
program
fi
or
if [ conditionals ]
 then
 program
fi # end character


注意事項

  • [条件付き]の場合は、括弧と条件の間にスペースが必要です。
  • スペースが続く場合

1.4.2 ハンズオンケース

数字を入力し、それが1であれば私は張三、2であれば私は李斯、それ以外であれば出力される。

[root@node01 shell]# vim if.sh
if [ $1 -eq '1' ]
 then 
  echo 'I am Zhang San'
elif [ $1 -eq '2' ]
 then 
  echo 'I am Li Si' 
fi
[root@node01 shell]# sh if.sh 2
I am Li Si
[root@node01 shell]# sh if.sh 1
I am Zhang San
[root@node01 shell]# sh if.sh 3
[root@node01 shell]#


1.5 caseステートメント

1.5.1 基本的な構文

case $variable name in
 "value1")
   Program 1 ;;
 "value2")
   Program 2 ;;
 "value n")
   Program n ;;
 esac 


注意

  • ケースは "in"で終わり、各マッチは右括弧 ")" で終わらなければなりません。
  • 二重分割の ";;" はコマンドシーケンスの終了を示し、java の break に相当します。
  • 最後の "*)" は、java の default とは異なり、default モードを表します。

1.5.2 ハンズオンケース

数字を入力し、1ならクラスリーダー、2なら副リーダー、それ以外ならサイレンを出力します。

[root@node01 shell]# vim case.sh 
#! /bin/bash
case $1 in
 '1')
  echo 'class leader' ;;
 '2')
  echo 'Vice squad leader' ;;
 '*') 
  echo 'siren' ;;
esac 
[root@node01 shell]# sh case.sh 1
squad leader
[root@node01 shell]# sh case.sh 2
Assistant shift manager
[root@node01 shell]# sh case.sh 3
Siren


2. ループ

2.1 Forループ

2.1.1 基本構文1

for ((initial value; loop control condition; variable change))
 do 
 Program
done 


2.1.2 ハンズオンケース

1から100までの足し算

**[root@node01 shell]# vim for1.sh
#! /bin/bash
num=0
for((i=0;i<=100;i++))
 do
 num=$[$num+$i]
done
echo $num
[root@node01 shell]# sh for1.sh 
5050

2.1.3 基本構文2

for variables in value1 value2 value3 ...
 do
  program
done 


2.1.4 ハンズオンの例

すべての入力パラメータを表示する

hie[root@node01 shell]# vim for2.sh 
#! /bin/bash
for i in $*
 do 
 echo " I love $i "
done
[root@node01 shell]# sh for2.sh 张三 李四
 I love 张三 
 I love 李四 


と$@の違いを比較する

関数やスクリプトに渡される引数のうち、二重引用符で囲むことができないものは、$ *と$ @の両方で示します。

[root@node01 shell]# vim for3.sh 
#! /bin/basn
for i in $*
do 
 echo " I love $i"
done

for j in $@
do 
 echo " I love $j"
done
[root@node01 shell]# sh for3.sh 张三 李四 王五
 I love 张三
 I love 李四
 I love 王五
 I love 张三
 I love 李四
 I love 王五


二重引用符で囲むと "", "$*" は、すべてのパラメータを一括して $1,$2,3... の形で受け取ります。3... .3... .n; "$@ は個々の引数を "$1", "$2", "3 " ... ... "3" ... "3" ...で区切って表示することができます。すべてのパラメータを "n" の形式で出力します。

[root@node01 shell]# vim for4.sh 
#! /bin/bash
for i in "$*"
do 
 echo " I love $i "
done
for j in "$@"
do
 echo " I love $j "
done
[root@node01 shell]# sh for4.sh 张三 李四 王五
 I love 张三 李四 王五 
 I love 张三 
 I love 李四 
 I love 王五 

3.2 whlie ループ

3.2.1 基本的な構文

while [submit judgmental]
do
 program
done 


3.2.2 ハンズオンケース

1から100までの足し算

[root@node01 shell]# vim while.sh 
#! /bin/bash
num=0
i=1
while [ $i -le 100 ]
do
 num=$[$num+$i]
 i=$[$i+1]
done
echo $num
[root@node01 shell]# sh while.sh 
5050


以上、「条件付き判定文とループを使ったシェルスクリプトのクイックスタート」をお届けしました。シェルの条件判断文とループの詳細については、スクリプトハウスの過去の記事を検索するか、以下の関連記事を引き続き参照してください。