シェルスクリプトの条件ステートメントとifステートメントの使用

1.状態テスト

  • シェルスクリプトプログラムに特定の「知性」を持たせたい場合、最初の質問は、さまざまな状況をどのように区別して、どのような操作を実行するかです。
  • シェル環境は、コマンド実行後の戻り値の状態($?)により、実行が成功したかどうかを判定し、戻り値が0の場合は成功、それ以外の場合は0以外の値で失敗を意味します。

1.1テストコマンド

  • 特定の条件式をテストできます。戻り値は0で、真であることを示します。
基本格式:
 test   条件表达式
 [ 条件表达式 ]
  • これら2つの関数はまったく同じです。後者はより一般的に使用され、プログラミングの習慣に近くなっています。注:少なくとも1つのスペースで、後者の角括弧と条件式を区切ります。

1.1.1ファイルのテスト

  • 指定されたパス名に従って、それがファイルまたはディレクトリに対応するかどうか、またはファイルが読み取り可能、書き込み可能、​​実行可能などであるかどうかを判断します。
  • 一般的な操作オプション
-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exit)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试是否设置有可执行(Excute)权限

例:

[root@localhost ~]# [ -d /dev/sr0 ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ -e /dev/sr0 ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ -e /dev/cdrom ]&& echo "YES"       ## 文件是否为目录,是的话输出YES
YES

1.1.2ファイル間の判断

  • 2つのファイルを比較するために、一般的に使用されるオプションは次のとおりです。
-nt:判断文件A是否比文件B新
-ot:判断文件A是否比文件B旧
-ef:判断两个文件是否为同一个文件,用来判断两个文件是否指向同一个inode

例:

[root@localhost ~]# touch a
[root@localhost ~]# touch b
[root@localhost ~]# [ a -ot b ]&& echo "YES" || echo "NO"   ## a是否比b文件旧
YES
[root@localhost ~]# [ a -nt b ]&& echo "YES" || echo "NO"  ## a是否比b文件新
NO
[root@localhost ~]# ln a c  ## 创建a文件的硬连接c
[root@localhost ~]# [ a -ef c ]&& echo "YES" || echo "NO"  
YES                ## 指向同一个inode

2、整数値の比較

  • 与えられた2つの整数値に従って、2番目の数値より大きいか、等しいか、小さいかなど、最初の数値と2番目の数値の関係を決定します。
  • 一般的なオプションは次のとおりです。
-eq: 第一个数等于(Equal)第二个数
-ne:第一个数不等于(Not Equal)第二个数
-gt:第一个大于(Greater Than)第二个数
-lt:第一个数小于(Lesser Than)第二个数
-le:第一个数小于或等于(Lesser or Equal)第二个数
-ge:第一个数大于或等于(Greater or Equal)第二个数
  • 整数値の比較は、シェルスクリプトでよく使用されます。これは、ログインしているユーザーの数、開いているプロセスの数、およびディスク使用量が標準に達しているかどうかなどを判断するために使用できます。
[root@localhost ~]# unum=`who | wc -l`
[root@localhost ~]# [ $unum -gt 5 ]&& echo "litter"|| echo "Too many"
litter                      ## 查看登录的用户数量,大于等于5个发出Too many 的报警

3、文字列比較

  • 文字列比較は、通常、ユーザー入力、システム環境などが条件を満たすかどうかを確認するために使用されます。インタラクティブな操作を提供するシェルスクリプトでは、ユーザーが入力した位置パラメータが要件を満たしているかどうかを判断するために使用できます。
  • 一般的なオプションは次のとおりです
=: 第一个字符串与第二个字符串相同
!=:第一个字符串与第二个字符串不相同,其中“!”符号表示取反
-z:检查字符串是否(Zero),对于未定义或赋予空值的变量将视为空串。

例:

[root@localhost ~]# echo $LANG  ## 查看当前语言环境
zh_CN.UTF-8
[root@localhost ~]# [ $LANG != "en.US" ]&& echo  "Not en.US"  ## 字符串测试结果 (不等于)
Not en.US

4、論理テスト

  • ロジックテストとは、2つ以上の条件間の依存関係を判断することです。システムタスクが複数の異なる条件に依存している場合、これらの条件が同時に確立されているかどうか、またはそれらの条件の1つが確立されている限り、テストプロセスが必要です。
シンボル 意味
&& 論理ANDは「and」を意味し、両方の条件がtrueの場合にのみ、テストコマンド全体の戻り値は0になります(結果はtrueです)。Testコマンドを使用する場合、「&&」を「-a」に変更できます。
|| 論理ORは「または」を意味します。前後の2つのコマンドのいずれかが確立されている限り、テストコマンド全体の戻り値は0です(結果が確立されます)。Testコマンドを使用する場合、「||」を「-o」に変更できます
論理否定は「いいえ」を意味し、指定された条件が成立しない場合のみ、テストコマンド全体の戻り値が0(結果成立)となります。

5、ifステートメント

シェルスクリプトアプリケーションでは、ifステートメントに最も一般的に使用されるフロー制御メソッドを使用して、特定の条件のテスト結果に応じてさまざまな操作(if ... then ...)を実行します。

  • さまざまなレベルの複雑さに応じて、ifステートメントの選択構造は、さまざまなアプリケーションに適した3つの基本的なタイプに分類できます。

5.1単一分岐ifステートメント

  • ifステートメントの「分岐」は、さまざまなテスト結果に対応する実行ステートメント(1つ以上)を指します。分岐選択構造の場合、対応するコードは「条件が満たされた」場合にのみ実行され、それ以外の場合は何も実行されません。
if 条件测试操作
then 
	命令序列
fi
  • フローチャート
    ここに画像の説明を挿入

5.2二重分岐ifステートメント

  • 二重分岐選択構造では、「条件が満たされている」と「条件が満たされていない」の2つの状況に対して異なる操作を実行する必要があります。
if 条件测试操作
then
命令序列 1
else
命令序列 2
fi
  • フローチャート
    ここに画像の説明を挿入

5.3マルチブランチifステートメント

  • ifステートメントは、テスト結果が真かどうかに基づいて操作を実行できるため、ネストして複数の判断に使用できます。
  • シェルスクリプトを作成する場合、ifステートメントのネストは一般的に使用されません。複数のネストを使用すると、プログラムの構造がより複雑になるためです。
  • 基本的なフォーマットは以下の通りです
if 条件测试语句 1
then
命令序列 1
elif 条件测试语句 2
then 
	命令序列 2
else
	命令序列 3
fi

  • フローチャート
    ここに画像の説明を挿入

5.3 if multi-branchステートメントの適用

  • ボックスを推測し、列挙メソッドを使用して複数の分岐ステートメントを使用する
#! /bin/bash
 read -p "请输入您的出拳手势 其中  0代表拳头 1代表剪刀 2代表布 "  A
        B=$[$RANDOM%3]
if [ $A -ge 0 ]&&[ $A -le 2 ]
 then
  if [ $A -eq 0 ]
then
    if [ $B -eq 0 ]
then
        echo "您出的是拳头"
        echo "电脑出的也是拳头"
        echo "这局是平局"
elif [ $B -eq 1 ]
then
        echo "您出的是拳头"
        echo "电脑出的是剪刀"
        echo "您赢了!"
else
        echo "您出的是拳头"
        echo "电脑出的是布"
        echo "您输了,电脑赢了!"
fi
  elif [ $A -eq 1 ]
then
    if [ $B -eq 0 ]
then
        echo "您出的是剪刀"
        echo "电脑出的是拳头"
        echo "您输了,电脑赢了"
    elif [ $B -eq 1 ]
 then
        echo "您出的是剪刀"
        echo "电脑出的也是剪刀"
        echo "这局是平局"
else
        echo "您出的是剪刀"
        echo "电脑出的是布"
        echo "您赢了!"
fi
  elif [ $A -eq 2 ]
then
      if [ $B -eq 0 ]
then
         echo "您出的是布"
         echo "电脑出的是拳头"
         echo "您赢了"
     elif [ $B -eq 1 ]
 then
         echo "您出的是布"
         echo "电脑出的是剪刀"
         echo "您输了,电脑赢了"
 else
         echo "您出的是布"
         echo "电脑出的也是布"
         echo "这局是平局"
fi
else
        echo ""
fi
else
        echo "请输入正确的数字"
fi
          

おすすめ

転載: blog.csdn.net/weixin_47219725/article/details/107403294