if [ $# -lt 2 ] はどういう意味ですか?

if [ $# -lt 2 ] はどういう意味ですか?

私は Unix/Linux の初心者です。私より前の開発者のコ​​ードを理解しようとしています。誰かこの行が何を意味するのか教えてもらえませんかif [ $# -lt 2 ]?

答え1

Bash では、$#設定されている位置パラメータの数に拡張されます。

if [ $a -lt $b ]a の値が b の値より小さいかどうかを意味します。

if [ $# -lt 2 ]設定された位置パラメータの数が 2 未満であることを意味します。

実際の例としては、関数に渡されるパラメータを数えるためにこれを使います。関数を次のように定義すると:

count_words(){
  if [ $# -lt 2 ]
  then
    echo "There are less than two words."
  else
    echo "There are 2 or more words."
  fi
}

次に、異なる単語数で関数を呼び出すと、結果は次のようになります。

$ count_words hello
There are less than two words.

$ count_words how many words
There are two or more words.

$ count_words
There are less than two words.

$ count_words two words
There are two or more words.

答え2

これは次の 3 つの要素で構成されています。

  • $#スクリプトまたは関数への位置引数の数を格納するシェル変数です。

  • [は特別な構文ではなく、プログラムの名前であり、 の別名ですtest。( または を参照してくださいman [man test)

    のコマンド ラインは、[式として解析されます。は、引数、、、(視覚的な区切り文字に過ぎません)を使用[ $# -lt 2 ]して を呼び出します。 式が true と評価された場合(つまり、スクリプトへの引数の数が 2 未満の場合)、に設定されて正常終了コードが返され、それ以外の場合はに設定されて失敗終了コードが返されます。 これを確認するには、次のように入力します。[$#-lt2]$?0$?1

    [ 1 -lt 2 ]; echo $?    # 1 < 2 is true: 0
    [ 2 -lt 1 ]; echo $?    # 2 < 1 is false: 1
    
  • if condition; then body; fiコマンド を評価しcondition、正常終了コードを返す場合は、 内のコマンドの評価に進みますbody

遭遇する可能性のあるいくつかの事柄に注意する価値があります:

  • このtrueユーティリティは常に成功終了コードを返し、false常に失敗を返すので、条件でそれらを使用できます。例:

    while true; do
    done
    
  • if [ $foo = "yes" ]$fooは、空の文字列 ( [ = yes ]) またはスペースを含む文字列 ( ) に展開された場合は機能しません[ no thanks = yes ]。そのため、次のような表示がよく見られます。

    if [ "x$foo" = "xyes" ]
    

    したがって、 はの最初のオペランドとして[単一の引数を受け取ります。xno thanks=

  • [[]]は貝殻ですキーワード組み込み) には、上記の制限に対処するための特別な解析ルールが備わっており、追加機能が提供される場合もあります。

関連情報