shellの基本演算子

7471 ワード

Shellは、次のような複数の演算子をサポートします.
  • 演算子
  • 関係演算子
  • ブール演算子
  • 文字列演算子
  • ファイルテスト演算子
  • 原生bashは簡単な数学演算をサポートしていませんが、awkやexpr、exprなどの他のコマンドで実現できます.exprは、式の評価操作を完了するための式計算ツールです.
    たとえば、2つの数を加算します(単一引用符ではなく逆引用符`を使用することに注意してください):
    #!/bin/bash
    val=`expr 2 + 2`
    echo "      : $val"
    

    スクリプトを実行し、次のように出力します.
          : 4
    

    次の点に注意してください.
  • 式と演算子の間にスペースが必要です.例えば2+2は間違っていて、2+2と書かなければなりません.これは私たちがよく知っている多くのプログラミング言語とは違います.
  • 完全な式は``に含まれる.この文字はよく使われる一重引用符ではなく、Escキーの下にあることに注意してください.

  • 1.算術演算子
    次の表に、変数aが10、変数bが20であると仮定した一般的な演算子を示します.
    演算子
    説明
    例を引く

    加算
    `expr$a+$b`結果は30
    -
    減算
    `expr$a-$b`結果は-10
    *
    乗算#ジョウサン#
    expr$a*$b`結果は200
    /
    除算
    `expr$b/$a`結果は2
    %
    余剰を取る
    `expr$b%$a`結果は0
    を選択します.
    に値を付ける
    a=$b変数bの値をaに与える
    ==
    等しい?
    [$a=$b]falseを返す
    !=
    等しくない?
    [$a!=$b]はtrueを返します.
    注意:条件式は角カッコの間に配置され、スペースが必要です.たとえば、[$a=$b]は間違っています.[$a=$b]と書く必要があります.≪インスタンス|Instance|emdw≫
    #!/bin/bash
    a=10
    b=20
    
    val=`expr $a + $b`
    echo "a + b : $val"
    
    val=`expr $a - $b`
    echo "a - b : $val"
    
    val=`expr $a \* $b`
    echo "a * b : $val"
    
    val=`expr $b / $a`
    echo "b / a : $val"
    
    val=`expr $b % $a`
    echo "b % a : $val"
    
    if [ $a == $b ]
    then
       echo "a    b"
    fi
    if [ $a != $b ]
    then
       echo "a     b"
    fi
    

    スクリプトを実行し、次のように出力します.
    a + b : 30
    a - b : -10
    a * b : 200
    b / a : 2
    b % a : 0
    a     b
    

    注意:
  • 乗算記号(*)の前には、乗算を実現するために反スラッシュ()を付けなければなりません.
  • if...then...fiは条件文で、後で説明します.
  • MACにおけるshellのexpr構文は、$((式))であり、ここで式の「*」は、エスケープ記号「」を必要としない.

  • 2.関係演算子
  • 関係演算子は、文字列の値が数値でない限り、数値のみをサポートします.

  • 次の表に、変数aが10、変数bが20であると仮定した一般的な関係演算子を示します.
    演算子
    説明
    例を引く
    -eq
    2つの数が等しい場合はtrueを返します.
    [$a-eq$b]falseを返す
    -ne
    2つの数が等しくない場合はtrueを返します.
    [$a-ne$b]はtrueを返します.
    -gt
    左の数が右の戻りtrueより大きい
    [$a-gt$b]falseを返す
    -lt
    左の数が右の戻りtrueより小さい
    [$a-lt$b]はtrueを返します
    -ge
    左の数が右の戻りtrueより大きい
    [$a-ge$b]falseを返す
    -le
    左の数が右の戻りtrueより小さい
    [$a-le$b]はtrueを返します.
    ≪インスタンス|Instance|emdw≫
    #!/bin/bash
    
    a=10
    b=20
    
    if [ $a -eq $b ]
    then
       echo "$a -eq $b : a    b"
    else
       echo "$a -eq $b: a     b"
    fi
    if [ $a -ne $b ]
    then
       echo "$a -ne $b: a     b"
    else
       echo "$a -ne $b : a    b"
    fi
    if [ $a -gt $b ]
    then
       echo "$a -gt $b: a    b"
    else
       echo "$a -gt $b: a     b"
    fi
    if [ $a -lt $b ]
    then
       echo "$a -lt $b: a    b"
    else
       echo "$a -lt $b: a     b"
    fi
    if [ $a -ge $b ]
    then
       echo "$a -ge $b: a       b"
    else
       echo "$a -ge $b: a    b"
    fi
    if [ $a -le $b ]
    then
       echo "$a -le $b: a       b"
    else
       echo "$a -le $b: a    b"
    fi
    

    スクリプトを実行し、次のように出力します.
    10 -eq 20: a     b
    10 -ne 20: a     b
    10 -gt 20: a     b
    10 -lt 20: a    b
    10 -ge 20: a    b
    10 -le 20: a       b
    

    3.ブール演算子
    次の表に、変数aが10、変数bが20であると仮定した一般的なブール演算子を示します.
    演算子
    説明
    例を引く
    !
    非演算
    [!false]はtrueを返します
    -o
    または演算
    [$a-lt 20-o$b-gt 100]はtrueを返します.
    -a
    演算
    [$a-lt 20-a$b-gt 100]falseを返す
    ≪インスタンス|Instance|emdw≫
    #!/bin/bash
    a=10
    b=20
    
    if [ $a != $b ]
    then
       echo "$a != $b : a     b"
    else
       echo "$a != $b: a    b"
    fi
    if [ $a -lt 100 -a $b -gt 15 ]
    then
       echo "$a    100   $b    15 :    true"
    else
       echo "$a    100   $b    15 :    false"
    fi
    if [ $a -lt 100 -o $b -gt 100 ]
    then
       echo "$a    100   $b    100 :    true"
    else
       echo "$a    100   $b    100 :    false"
    fi
    if [ $a -lt 5 -o $b -gt 100 ]
    then
       echo "$a    5   $b    100 :    true"
    else
       echo "$a    5   $b    100 :    false"
    fi
    

    スクリプトを実行し、次のように出力します.
    10 != 20 : a     b
    10    100   20    15 :    true
    10    100   20    100 :    true
    10    5   20    100 :    false
    

    4.論理演算子
    以下にShellの論理演算子を紹介し,変数aが10,変数bが20であると仮定する.
    演算子
    説明
    例を引く
    &&
    ロジックのAND
    [$a-lt 100&&$b-gt 100]]falseを返す
    124 124
    ロジックのOR
    [$a-lt 100|$b-gt 100]]はtrueを返します.
    ≪インスタンス|Instance|emdw≫
    #!/bin/bash
    a=10
    b=20
    
    if [[ $a -lt 100 && $b -gt 100 ]]
    then
       echo "   true"
    else
       echo "   false"
    fi
    
    if [[ $a -lt 100 || $b -gt 100 ]]
    then
       echo "   true"
    else
       echo "   false"
    fi
    

    スクリプトを実行し、次のように出力します.
       false
       true
    

    5.文字列演算子
    次の表に、変数aがabcであり、変数bがefgであると仮定した一般的な文字列演算子を示します.
    演算子
    説明
    例を引く
    を選択します.
    2つの文字列が等しい場合はtrueを返します.
    [$a=$b]falseを返す
    !=
    2つの文字列が等しくない場合はtrueを返します.
    [$a!=$b]はtrueを返します.
    -z
    文字列の長さ0はtrueを返します.
    [-z$a]falseを返します
    -n
    文字列の長さが0でない場合はtrueを返します.
    [-n'$a']はtrueを返します.
    str
    文字列が空でない場合はtrueを返します.
    [$a]はtrueを返します
    ≪インスタンス|Instance|emdw≫
    #!/bin/bash
    a="abc"
    b="efg"
    
    if [ $a = $b ]
    then
       echo "$a = $b : a    b"
    else
       echo "$a = $b: a     b"
    fi
    if [ $a != $b ]
    then
       echo "$a != $b : a     b"
    else
       echo "$a != $b: a    b"
    fi
    if [ -z $a ]
    then
       echo "-z $a :        0"
    else
       echo "-z $a :         0"
    fi
    if [ -n "$a" ]
    then
       echo "-n $a :         0"
    else
       echo "-n $a :        0"
    fi
    if [ $a ]
    then
       echo "$a :       "
    else
       echo "$a :      "
    fi
    

    スクリプトを実行し、次のように出力します.
    abc = efg: a     b
    abc != efg : a     b
    -z abc :         0
    -n abc :         0
    abc :       
    

    6.ファイルテスト演算子
    ファイルテスト演算子は、Unixファイルのさまざまなプロパティを検出するために使用されます.
    オペレータ
    説明
    例を引く
    -b file
    ファイルはブロックデバイスファイルでtrueを返します
    [-b$file]falseを返します
    -c file
    ファイルは文字デバイスファイルでtrueを返します
    [-c$file]falseを返します
    -d file
    ファイルはディレクトリがtrueを返す
    [-d$file]falseを返します
    -f file
    ファイルが通常のファイルかどうかはtrueを返します.
    [-f$file]はtrueを返します
    -g file
    ファイルはSGIDビットを設定してtrueを返す
    [-g$file]falseを返します
    -u file
    ファイルはSUIDビットを設定してtrueを返します
    [-u$file]falseを返します
    -k file
    ファイルにSticky Bitを設定してtrueを返します.
    [-k$file]falseを返します
    -p file
    ファイルは有名なパイプでtrueを返します
    [-p$file]falseを返します
    -r file
    ファイルが存在し、読み取り可能な戻りtrue
    [-r$file]はtrueを返します.
    -w file
    ファイルが存在し、書き込み可能でtrueを返します.
    [-w$file]はtrueを返します
    -x file
    ファイルが存在し、trueを返すことができます.
    [-x$file]はtrueを返します
    -s file
    ファイルが空の場合はtrueを返します
    [-s$file]はtrueを返します
    -e file
    ディレクトリを含むファイルが存在する場合はtrueを返します.
    [-e$file]はtrueを返します
    インスタンス変数fileは、ファイル「/var/www/runoob/test.sh」を表し、rwx権限を持つ100バイトのサイズです.
    #!/bin/bash
    file="/var/www/leon/test.sh"
    if [ -r $file ]
    then
       echo "    "
    else
       echo "     "
    fi
    if [ -w $file ]
    then
       echo "    "
    else
       echo "     "
    fi
    if [ -x $file ]
    then
       echo "     "
    else
       echo "      "
    fi
    if [ -f $file ]
    then
       echo "       "
    else
       echo "       "
    fi
    if [ -d $file ]
    then
       echo "      "
    else
       echo "       "
    fi
    if [ -s $file ]
    then
       echo "     "
    else
       echo "    "
    fi
    if [ -e $file ]
    then
       echo "    "
    else
       echo "     "
    fi
    

    スクリプトを実行し、次のように出力します.