Linux|シェル プログラミング|シェル スクリプトの高度なスキル (シェル スクリプト内の括弧、角括弧、中括弧、論理的判断、スクリプトの正常な終了など)

序文:

シェルスクリプトは言うは易く難しい、論理的に判断した上でカスタム変数、環境変数、システム組み込み関数、スクリプトの構造など、頭を悩ませるのが本当に難しいです。デザインを組み合わせると、スクリプトが非常に複雑になる可能性があります。

そこで、この記事では主にシェルスクリプト内のシステム関数(dirname、basename、exit)、論理判定記号、gt、lt、eq、ne、ge、le、n、r、x、w、e、d、f、zを使用します。 , variable Wrapper () [] {} [[]] ` これらの内容は大まかな紹介になります

一、

変数定義

たとえば、値が 10 の変数 a を定義します。

a=10

エラーの定義 (両端のスペースが間違っています):

[root@EULER2 ~]# a =2
-bash: a: command not found
^[[6~[root@EULER2 ~]# a= 2
-bash: 2: command not found

では、この定義方法が最も簡単ですが、変数名と変数値の間の=記号の両側にスペースが入らないように注意してください。 

さて、実際の作業としては、変数はそれほど単純ではありません。たとえば、変数 b を定義し、テキスト ファイルの内容を代入します (ここではバッククォートを使用します)。

[root@EULER2 ~]# b=`cat test.sh `
[root@EULER2 ~]# echo $b
#!/bin/bash a=12 b=12 if [ $a -eq $b ]; then echo "bianliang a dengyu bianliang b " else echo "bianliang a budengyu bianliang b " fi

2 番目の定義方法 ($ は単一の括弧の組み合わせに一致します):

[root@EULER2 ~]# b=$(cat test.sh)
[root@EULER2 ~]# echo $b
#!/bin/bash a=12 b=12 if [ $a -eq $b ]; then echo "bianliang a dengyu bianliang b " else echo "bianliang a budengyu bianliang b " fi

それでは、2 つのアプローチの違いは何でしょうか? どちらがより適切ですか?

効果は基本的に同じですが、バッククォートが古い使用法であり、$( ) が新しい使用法である点が異なりますが、学習でも実務でも、以下の理由から $() の使用をお勧めします。

1、

バッククォートは引用符と混同されやすい

2、

バッククォートで特殊文字を処理する場合は、次のような追加のエスケープ文字を記述する必要があります。

[root@EULER2 ~]# echo $HOSTNAME
EULER2
[root@EULER2 ~]# b=`echo $HOSTNAME`
[root@EULER2 ~]# echo $b
EULER2

この時点で、EULER2 ではなく $HOSTNAME のみを出力したい場合は、二重エスケープ文字を使用する必要があります。

[root@EULER2 ~]# b=`echo \\$HOSTNAME`
[root@EULER2 ~]# echo $b
$HOSTNAME

単一のエスケープ層は役に立ちません。

[root@EULER2 ~]# b=`echo \$HOSTNAME`
[root@EULER2 ~]# echo $b
EULER2

また、$() に必要なエスケープ文字は 1 つだけですが、考慮する必要があるのは、バッククォートを記述する方が簡単であるということです。

二、

論理的な判断者

論理ジャッジは主に、スクリプト内の if ステートメント、while ループ、for ループ、および case 選択ステートメントで使用されます。つまり、通常はこれらのステートメントに埋め込まれます。これらのステートメントの実行方向 (たとえば、ループから抜け出すかどうか、次の条件に入るかどうかなど) を制御するための具体的な実装は、実際には 2 つの変数の値の論理的な判断です。 2 つの値がより大きい (gt)、以上 (ge)、等しい (eq)、未満 (lt)、以下 (le) であるかどうかを判断し、文字列の長さがゼロ ( z)、文字列の長さはゼロ以外 (n) です。

1、-gt -ge

-gt 変数が特定の値より大きいかどうかを判断します。

-ge 変数が特定の値以上かどうかを判断します

次に、スクリプト ファイル /etc/profile は比較的包括的であり、一部の論理判断者はこのファイルを例として使用します。

if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
    umask 002
else
    umask 022
fi

このシェルコードは、uid が 199 より大きい場合のみ umask の値が 002 であり、199 以下の場合は umask の値が 022 であることを示しています。

2、

-lt -the

-lt 変数の値が特定の値より小さいかどうかを判断します。

-le 変数の値が特定の値以下かどうかを判断します。

たとえば、次のスクリプト:

#!/bin/bash
a=20
if [ $a -lt 15 ];
then
echo "bianliang a shi xiaoyu 15de "
else
echo "bianliang a shi dayu 15de "
fi

明らかに、20 が 15 未満である場合は false なので、出力は else の後のコードになります。

3、

-z と -n と $variable

-z は文字列の長さがゼロかどうかを判断し、0 の場合は true を返します。

-n は文字列の長さがゼロでないかどうかを判断し、0 でない場合は true を返します。

$変数は-nと同じで、文字列の長さが0でないかどうかを判定し、0でない場合はtrueを返します。

-z の例 (二重引用符の使用に注意してください):

#!/bin/bash
a=shiguang
b=""
if [ -z $a ];
then
echo "a zifuchuan wei kong"
else
echo "a zifuchuan you neirong"
fi
if [ -z $b ];
then
echo "b zifuchuan wei kong"
else
echo "b zifuchuan you neirong"
fi
[root@EULER2 ~]# bash test.sh 
a zifuchuan you neirong
b zifuchuan wei kong

-n の例 (二重引用符が使用されていることに注意してください)

[root@EULER2 ~]# bash test.sh 
a zifuchuan you
b zifuchuan meiyou
#!/bin/bash
a=shiguang
b=""
if [ -n "$a" ];
then
echo "a zifuchuan you"
else
echo "a zifuchuan meiyou"
fi
if [ -n "$b" ];
then
echo "b zifuchuan you"
else
echo "b zifuchuan meiyou"
fi

$ 変数の例 (ラップに "" 二重引用符を使用してみてください。この例では二重引用符は使用されていません。標準化されていません):

#!/bin/bash
a="shiguang"
if [ $a ];
then
echo "a bu kong"
else
echo "a kong"
fi
[root@EULER2 ~]# bash test1.sh 
a bu kong

####: 二重括弧の場合、変数をラップするために二重引用符は必要ありません。それ以外の場合は、変数をラップするために二重引用符が必要であることに注意してください。次に例を示します。

#!/bin/bash
a=""
if [[ $a ]];
then
echo "a bu kong"
else
echo "a kong"
fi

出力は次のとおりです。

[root@EULER2 ~]# bash test1.sh 
a kong

4、

= == -eq

これら3つは同等判定ですが、使用範囲に注意が必要で、 == は文字列と整数の比較判定が可能ですが、-eq は整数のみの比較判定が可能なため、-eq の範囲は となります。比較的狭い、= も可能 文字列や整数の比較判定が可能 算術演算式「(( ))」において、単一の等号は代入算術演算子、二つの等号は等価算術演算子です。 == より大きい = より大きい -eq と考えることができます。また、論理的な判断を行う場合は、単一括弧の代わりに二重括弧を使用するのが一般的です。

例は次のとおりです。

#!/bin/bash
a="shiguang"
b="shiguang"
if [[ $a = $b ]];
then
echo "a dengyu b"
else
echo "a budengyu b"
fi

つづく!

おすすめ

転載: blog.csdn.net/alwaysbefine/article/details/131644367