bashスクリプトプログラミングの条件判断、算術演算および例


bashではどのように条件ブレークを実現しますか?
条件テストのタイプ:
整数テスト
文字テスト
ファイルテスト
条件テストの式
[expression],コマンドテスト法
[[expression],キーワードテスト法
test expression,testコマンドテスト法
テスト方法:
整数テスト
-eq:2つの整数が等しいかどうかをテストする、等しいのは真で、等しくないのは偽で、例えば[$a-eq$b]で、もし等しいならば、実行状態の戻り値は必ず0で、さもなくば1-255の間のいずれかの値である.
-ne:2つの整数が等しくないかどうかをテストします.等しいのは偽で、等しくないのは真です.
-gt:ある数が別の数より大きいかどうかをテストし、真より大きいかどうかをテストします.そうしないと偽です.
-lt:1つの数が他の数より小さいかどうかをテストし、真より小さいかどうかをテストします.そうしないと偽です.
-ge:1つの数が他の数より大きいかどうかをテストし、真であるかどうかをテストします.そうしないと偽です.
-le:1つの数が他の数より小さいかどうかをテストします.
コマンド間の論理関係テスト
論理と:そのうちの1つが偽であれば、結果は必ず偽であり、短絡テストであり、第1の条件が偽である場合、第2の条件は実行されない.1番目の条件が真の場合、2番目の条件は実行する必要があります.
たとえば、ユーザーの存在を照会し、情報を表示します.
        [root@station01 ~]# id user9 &>/dev/null && echo "user9 exist." 
        user9 exist.
たとえば、クエリー・ユーザーが存在しない場合に追加します.
        ! id user9 && useradd user9
        id user9 || useradd user9
例えば、1つのファイルの行数を判断し、100より大きい場合は大きなファイルとして表示する
1)方法一
        [user9@station01 ~]$ [ `wc -l /etc/inittab |cut -d' ' -f1 ` -gt 100 ] && echo "/etc/inittab is a large file." || echo "A small file."

 
        A small file.
2)方法2
ファイルtest 2.shの内容は以下の通りである.
        [root@station01 ~]# cat test2.sh 
        #!/bin/bash
        #
        Linenum=`wc -l /etc/inittab | cut -d ' ' -f1 `
        #echo $Linenum
        [ $Linenum -gt 100 ] && echo "/etc/inittab is a large file." || echo "/etc/inittab is a small file."

論理または:いずれかが真の場合、結果は必ず真であり、短絡テスト
コマンドの実行結果を参照し、コマンドで置き換える必要があります.
変数命名規則:変数にはアルファベット、数値、下線のみが含まれ、数値で始まることはできません.システムに既存の環境変数の名前と同じではいけません.名を見て義を知る
ユーザーがすでに存在していることを確認すると、このユーザーが存在していることを表示します.そうしないと、このユーザーを追加します.
    id user9 && echo "user9 exist."|| useradd user9
ユーザーが存在しないことを確認し、ユーザーを追加します.そうしないと、ユーザーが存在していることを示します.
    ! id user9 && useradd user9 || echo "user9 exsit."
ユーザーが存在しない場合は、パスワードを追加して設定します.そうしないと、すでに存在します.
    !id user9 && useradd user9 && echo "user9"| passwd --stdin user9 || echo "user9 exist"
    
ユーザーが存在しない場合は、ユーザーを追加し、ユーザー名と同じパスワードを設定します.存在する場合は、ユーザーが保存されていることを示します.最後に、システムに合計何人のユーザーがいるかを表示します.
    test3.shファイルの内容は以下の通りです.
    [root@station01 ~]# cat test3.sh 
    #!/bin/bash
    #
    ! id user1 &>/dev/null && useradd user1 && echo "user1" | passwd --stdin user1 &>/dev/null || echo "user1 is exist."
    ! id user2 &>/dev/null && useradd user2 && echo "user2" | passwd --stdin user2 &>/dev/null || echo "user2 is exist."
    USERS=`wc -l /etc/passwd | cut -d' ' -f1`
    echo "$USERS users."

実行結果は次のとおりです.
    [root@station01 ~]# ./test3.sh   
    user1 is exist.
    user2 is exist.
    41 users.
            
IDが0の場合は管理者として表示され、そうでない場合は一般ユーザーとして表示されます.
    test4.shファイルの内容は以下の通りです.
    [root@station01 ~]# cat test4.sh 
    #!/bin/bash
    #
    NAME=user1
    [ `id -u $NAME` -eq  0 ] && echo "$NAME is administrator." || echo "$NAME is a common user."

条件判断の制御構造
単一ブランチのif文:
if判断条件;then
文1
文2
        ....
    fi
指定されたユーザが存在するか否かを判断し、存在する場合は存在する
    [root@station01 ~]# cat test5.sh 
    #!/bin/bash
    #
    NAME=user1
    if id $NAME &>/dev/null;then
            echo "$NAME is esist."
    fi

二重ブランチのif文:
if判断条件;then
文1
文2
        ...
    else
文1
文2
        ...
    fi
指定されたユーザが存在するか否かを判断し、存在する場合は既に存在することを表示し、そうでない場合は存在しないことを表示する
    [root@station01 ~]# cat test5.sh 
    #!/bin/bash
    #
    NAME=user1
    if id $NAME &>/dev/null;then
            echo "$NAME is esist."
    else
            echo "$NAME is not exist."
    fi

指定されたユーザーが存在するかどうかを判断すると、存在する場合はすでに存在していることを表示し、そうでない場合は存在しないことを表示し、ユーザーを追加し、ユーザー名と同じパスワードを設定し、追加に成功したことを表示します.
    [root@station01 ~]# ./test5.sh 
    user12 is esist.
    [root@station01 ~]# cat test5.sh   
    #!/bin/bash
    #
    NAME=user12
    if id $NAME &>/dev/null;then
            echo "$NAME is esist."
    else
            useradd $NAME
            echo $NAME |passwd --stdin $NAME &>/dev/null
            echo "Add $NAME is successfully."
    fi

マルチブランチif文
if判断文;then
文1
文2
        ...
Elif判定文2;then
文1
文2
        ...
Elif判断文3;then
文1
        ...
    ...
    else
文1
        ...
    fi
スクリプトに構文エラーがあるかどうかをテスト
bash-n足本名
bash-x足本名、単一ステップ実行
条件判断は、実行状態と実行結果判断に分けられます
コマンドの実行結果を参照し、コマンドリファレンスを使用します.コマンドの実行状態の結果を参照し、参照は使用できません.
現在のシステムにユーザーがいるかどうかを判断するデフォルトshellがbashであり、ある場合はそのようなユーザーが何人いるかを表示します.そうしないと、表示されません. 
    [root@station01 ~]# cat test6.sh 
    #!/bin/bash
    #
    grep "\<bash$" /etc/passwd &>/dev/null
    RETVAL=$?
    if [ $RETVAL -eq 0 ];then
            USERS=`grep "\<bash$" /etc/passwd |wc -l`
            echo "The total of $USERS users is default bash shell."
    else
            echo "No such user."
    fi

現在のシステムにユーザーがいるかどうかを判断するデフォルトshellがbashであり、ある場合はユーザー名の1つを表示します.そうでない場合は、なしを表示します.
    [root@station01 ~]# cat test7.sh 
    #!/bin/bash
    #
    grep "\<bash$" /etc/passwd &>/dev/null
    RETVAL=$?
    if [ $RETVAL -eq 0 ];then
            USERS=`grep "\<bash$" /etc/passwd |head -1 |cut -d: -f1`
            echo "The one of $USERS is /etc/passwd file."
    else
            echo "No such user."
    fi

例えば、ファイルを指定して、空白の行があるかどうかを判断し、ある場合は何行が表示され、そうでない場合は空白の行が表示されます.
    [root@station01 ~]# cat test8.sh 
    #!/bin/bash
    #
    FILES=/etc/inittab
    grep "^$" $FILES &>/dev/null
    RETVAL=$?
    if [ $RETVAL -eq 0 ];then
            LINES=`grep "^$" $FILES |wc -l`
            echo "The total of $LINES line is blank."
    else
            echo "No such blank line."
    fi

例えば、あるユーザが、UIDがGIDに等しいか否かを判定し、同様であればSAMEを表示し、そうでなければNOT THE SAMEを表示する
1)方法一
    [root@station01 ~]# cat test9.sh 
    #!/bin/bash
    #
    USERNAME=user1
    if [ `id -u $USERNAME` -eq `id -g $USERNAME` ];then
            echo "The ${USERNAME}'s UID equal GID."
    else
            echo "Not the same"
    fi

2)方法2
    [root@station01 ~]# cat test10.sh 
    #!/bin/bash
    #
    USERNAME=user6
    if [ `grep "^\<$USERNAME\>" /etc/passwd | cut -d: -f3` -eq `grep "^\<$USERNAME\>" /etc/passwd | cut -d: -f4` ];then
            echo "The ${USERNAME}'s UID equal GID."
    else
            echo "Not the same"
    fi

SHELLで算術演算を行う方法
1、変数を定義するときは文字型で、演算するときはletコマンドを使う.
let算術演算式、let CC=$AA+$BB
次のようになります.
        [root@station01 ~]# AA=1
        [root@station01 ~]# BB=2
        [root@station01 ~]# let CC=$AA+$BB
        [root@station01 ~]# echo $CC
        3

2,$[算術演算式]
        
        CC=$[$AA+$BB]

3,$((算術演算式))
       
        CC=$(($AA+$BB))

4、expr算術演算式、各オペランドと演算子の間にスペースがあり、コマンドリファレンスを使用する
       
        CC=`expr $AA + $BB`

現在のプロセスコマンドを終了
exit:実行ステータス結果を定義するコマンドでスクリプトを終了します.使用法:exit 0-255のいずれかの数値.スクリプトがスクリプト終了コードを定義していない場合、最後のコマンドはスクリプトの終了コードです.
ユーザーが存在するかどうかを判断し、存在する場合はスクリプトを早期に終了し、そうでない場合は実行します.
    
    [root@station01 ~]# cat test5.sh 
    #!/bin/bash
    #
    NAME=user12
    if ! grep "^$NAME/>" /etc/passwd &>/dev/null;then
            echo "$NAME is exsit"
            exit 23
    fi
    
    if id $NAME &>/dev/null;then
            echo "$NAME is esist."
    else
            useradd $NAME
            echo $NAME |passwd --stdin $NAME &>/dev/null
            echo "Add $NAME is successfully."
    fi

実行結果:
    
    [root@station01 ~]# ./test5.sh     
    user12 is exsit
    [root@station01 ~]# echo $?
    23

例:あるユーザーにパスワード使用期限とパスワード残存期限を取得し、ユーザーパスワード残存期限が警告期限より小さいかどうかを判断し、小さい場合は「Warning」を提示し、そうでない場合は「OK」
パスワード使用期間=現在時刻-パスワード変更時間
パスワード残存期間=パスワード最長使用期間-パスワード使用期間
/etc/shadowファイルの説明:
Linux/etc/shadowファイルのレコード行は、/etc/passwdの1つに対応し、pwconvコマンドによって/etc/passwdのデータに基づいて自動的に生成されます.ファイル形式は/etc/passwdと同様で、いくつかのフィールドで構成され、フィールド間は「:」で区切られています.これらのフィールドは次のとおりです.
≪ログイン名|Login Name|ldap≫:≪パスワードの暗号化|Encryption Password|ldap≫:≪最終変更時間|Last Modification|ldap≫:≪最小間隔|Minimum Interval|ldap≫:≪最大間隔|Maximum Interval|ldap≫:≪警告時間|Warning Time|ldap≫:≪非アクティブ時間|Inactive Time
1)「ログイン名」は/etc/passwdファイルのログイン名と一致するユーザーアカウントである
2)「パスワード」フィールドには、暗号化されたユーザーパスワードワードが格納され、長さは13文字である.空の場合、対応するユーザーにはパスワードがなく、ログイン時にパスワードは必要ありません.集合{./0-9 A-Za-z}に含まれない文字が含まれている場合、対応するユーザーはログインできません.
3)「最終変更時間」は、ある時点からユーザが最後にパスワードを変更するまでの日数を表す.時間の起点は異なるシステムに対して異なる可能性があります.例えばSCOLinuxでは、この時間起点は1970年1月1日である.
4)「最小間隔」は、パスワードを2回変更するのに必要な最小日数です.
5)「最大間隔」とは、パスワードが有効に保たれている最大日数のことです.
6)「警告時間」フィールドは、システムからユーザパスワードが正式に無効になるまでの日数を表します.
7)「非活動時間」は,ユーザが活動を登録していないにもかかわらずアカウントが有効な最大日数を維持できることを示す.
8)「失効時間」フィールドは絶対日数を与え、このフィールドを使用すると、対応するアカウントの生存期間を与える.満期になると、このアカウントは合法的なアカウントではなく、ログインにも使用できません. 
[root@station01 ~]# cat test12.sh 
        #!/bin/bash
        #
        USERNAME="root"
        WARNING=`grep "$USERNAME\>" /etc/shadow- | cut -d: -f6`
        CHANGETIME=`grep "$USERNAME\>" /etc/shadow- | cut -d: -f3`
        LANGDAY=`grep "$USERNAME\>" /etc/shadow- | cut -d: -f5`
        CURSECOND=`date +%s`
        #one: 
        let CURDAY=$CURSECOND/86400
        #two:  
        PASSDAY=`expr $CURDAY - $CHANGETIME`
        #three: 
        LASTDAY=$[$LANGDAY-$PASSDAY]
        #four: 
        #LASTDAY=$(($LANGDAY-$PASSDAY))
        if [ $LASTDAY -lt $WARNING ];then
                echo "Waring,....."
        else
                echo "OK,......."
        fi
        
        #echo $WARNING
        #echo $CHANGETIME
        #echo $CURSECOND
        #echo $CURDAY
        #echo $PASSDAY
        #echo $LASTDAY

ファイルテスト
単眼演算に属する
-e FILE:ファイル名またはファイルパス、ファイルが存在するかどうかをテスト
-f FILE:ファイル名またはファイルパス、ファイルが通常のファイルであるかどうかをテスト
-d FILE:ファイル名またはファイルパス、指定したパスがディレクトリであるかどうかをテスト
-r FILE:指定されたファイルが現在のユーザーに対して読み取り権限があるかどうかをテストします.
-w FILE:指定されたファイルが現在のユーザーに対して書き込み権限があるかどうかをテストします.
-x FILE:指定ファイルが現在のユーザーに対して実行権限があるかどうかをテストします.
ファイルが存在するかどうかをテストする
    [ -e/etc/inittab ]
ファイルに実行権限があるかどうかをテスト
    [ -x/etc/rc.d/rc.sysinit ]
ファイルが存在するかどうかをテストし、空白の行があるかどうかをテストします.
   [root@station01 ~]# cat test8.sh 
    #!/bin/bash
    #
    FILES=/etc/inittabaa
    if [ ! -e $FILES ];then
            echo "No such file."
            exit 20
    fi
    grep "^$" $FILES &>/dev/null
    RETVAL=$?
    if [ $RETVAL -eq 0 ];then
            LINES=`grep "^$" $FILES |wc -l`
            echo "The total of $LINES line is blank."
    else
            echo "No such blank line."
    fi

実行結果
       
    [root@station01 ~]# ./test8.sh   
    No such file.
    [root@station01 ~]# echo $?
    20

ファイルを指定し、通常のファイルであれば通常のファイルを表示し、ディレクトリであればディレクトリとして表示します.そうしないと、ファイルが存在するかどうかを認識できず、存在しないと終了します.
        
[root@station01 ~]# ./test13.sh 
        Common file...
        [root@station01 ~]# cat test13.sh 
        #!/bin/bash
        #
        FILES=/etc/rc.d/rc.sysinit
        # if , 
        if [ ! -e $FILES ];then
                echo "No such file..."
                exit 24
        fi
        # if 
        if [ -f $FILES ];then
                echo "Common file..."
        elif [ -d $FILES ];then
                echo "Directory .."
        else
                echo "Unknown."
        fi

GB-2312