【bash学習006】if文の落とし穴

3499 ワード

if文はbash文の論理判断文であり,プログラムの次の方向を制御している.簡単そうに見えますが、穴がたくさんあって、うっかりすると落ちやすくなります.誰もが出会った穴は違いますが、if文で犯した過ちをまとめます.
if文の一般的な構造:
      if TEST
      then
          xxxxx
      fi  
または
      if TEST ; then
          xxxxx
      fi
if文の第1ピット:if文の判断文、すなわち文構造のTEST部分には、多くの書き方があり、それぞれの書き方が異なります.
一般的には5つの形式のtest文の書き方があります.
第1に、if cmp a bなどのコマンドを直接入力する.then「echo file a>file b」fi、ここの穴はこのような書き方が違和感があって、bashスクリプトを書く勇気がありませんでした.
2つ目は
      if [ $# -eq 0 ] ; then
        echo "have no arguments!"
      fi
ここの穴は、[]記号の両端のスペースで、必ずあります.次に,[]の戻り値,すなわち終了状態(exit status)は,予想に合致するか否かに常に注意する.if文の次のステップは、この戻り値に応じてブランチを実行します.if文があなたの考え通りに行われることを保証する愚かな方法があります.このとき[]内の終了状態を確定できない場合は、簡単な印刷文テストを書きます.例えばif[0];then echo "0 is true"else  echo "0 is false".最後に、[]を使用すると、論理エラーが頻繁に発生します.このように書くことはできません.[xxx&&xxx]または[xxxxx|xxx]または[xxxxx>xxxxx]です.
第三に、[[]]形式は、[]第三の欠点を補充し、より多くの機能を提供し、詳細は後述しない.
4つ目は,(()形式で,算術演算判断を行う.ここには、ABS(advanced bash-scripting guide)という本には、「If the expression evaluates as zero,it returns an exit status of 1,or「false」と書かれています.A non-zero expression returns an exit status of 0,or「true」.This is is in marked contrast to using the test and[constructs previously discussed]算術演算は戻り値を判断し,前の[]とは正反対である.()内部式の実行結果が0の場合、1の場合、またはfalseの場合、実行結果が1の場合、0の場合、またはtrueの場合.このピットは隠れていますので、注意してください.
5つ目は、test、testはbash内蔵コマンドで、使い方は同じです.
 
if文の第2のピット:if判断文の様々な比較演算子は、ここでは少しおかしい.ファイル比較子、算術比較子、文字列比較子、複合比較子の4種類の比較子があります.
ファイル比較記号:一般的な形式は-x fileで、xはあるアルファベットで、このアルファベットは常にファイル属性に関連しています.例えば-eはファイルの存在を表し、-dはディレクトリを表し、-hは記号リンクを表し、注意すべきは3つの特殊な形式で、file 1-nt file 2、file 1-ot file 2、file 1-ef file 2、2つのファイルの関係を表し、作成時間が前後(-nt、-ot)、同じファイル(-ef)にハードリンクします.
算術演算比較記号:整数比較、ここに違和感があるところがありますが、意外にも"=="と"!=「この2つの記号は、それに応じて
        -eq  if [ "$a"-eq "$b"]
        -ne if [ "$a"-ne "$b"]
他の比較子は、<,>,<=,>=,-lt,-gt,-ge,-leなど、正常です.しかし==,!=,<,>,>=,<=など、()構文を使う必要があります("$a"<="$b").他の文字は[]文法を使います.
文字列比較演算記号:=,=,=,!=,使用法はすべて「$a」x「$b」であり、xは対応する記号である.>,<,この2つの記号は、[$a]>[$b]]または[$a]>[$b]]に注意して使用します.-z,-nは、文字列が空であるか否かを判断する.
複合比較記号:
        -a
ロジックと
文1-a文2は真を返し、文1と文2が両方とも真である場合.
      -o
論理または
文1-o文2は真を返し、文1または文2が真である場合.
 
 
if文第3ピット:ifモザイク文.
    a=3     if [ "$a" -gt 0 ]     then       if [ "$a" -lt 5 ]        then      echo "The value of \"a\" lies somewhere between 0 and 5."      fi     fi     # Same result as:     if [ "$a" -gt 0 ] && [ "$a" -lt 5 ]     then      echo "The value of \"a\" lies somewhere between 0 and 5."     fi

しばらくこれらをまとめて、後で他の穴に落ちて、補充します.
 
bashの小さな習慣:いくつかの古典的なスクリプトを保存して、後で検索するのに便利で、例えば、2>/dev/null、echo“Usage:`basename$0`filename”>&2 exit$?
 
1つのリンク:http://www.ibm.com/developerworks/cn/linux/l-bash-test.html
癖にならない?もう一つのリンク:http://tldp.org/LDP/abs/html/tests.html