bash の if と then に関する質問

bash の if と then に関する質問

私はこれをスクリプトに書いています。他の部分もありますが、この部分だけで行き詰まっています。

if [[$# == $year $month $day  ]] ; then
    cal $day $month $year
fi

これを実行すると、次のメッセージが表示されます:

[[3: command not found

それで、問題は何でしょうか? 構文の問題でしょうか、それとも実際のコマンドの問題でしょうか?

参考になれば、スクリプトの残りの部分を以下に示します。

year=$(echo "$year" | bc)
month=$(echo "$month" | bc)
day=$(echo "$day" | bc)

if [[$# == $year $month $day  ]] ; then    
    cal $day $month $year
fi

答え1

角括弧の後にスペースを入れる必要があります[[

if [[ $# == $year $month $day ]] ; then    
    cal $day $month $year
fi

また、あなたが書いたようには動作しません。文字列として比較するか、まったく別の方法を使用します。おそらく$#:$year $month $day

if [[ "$#" == "$year$month$day" ]] ; then    
    cal $day $month $year
fi

答え2

これにはかなり多くの問題があります。

  1. [[:の後にスペースが必要です。

    [[ $# == $year $month $day ]]
    
  2. $#それはあなたが考えているものとは違います。それはスクリプトまたは関数に渡される引数の数です。あなたはそれが実際には引数のリストだと思っているようです。

  3. ==は文字列を比較するため、ある種のリストを与えることになります。スクリプトに渡された引数のリストを と比較するには$day $month $year、次のようにします。

    [[ "$@" == "$day $month $year" ]]
    
  4. calそうはいかない私のcal場合はそうはいきませんがどうやら新しいバージョンでは動作します。実際に何をしようとしているのか分かりませんが、動作しません。おそらく次のようなものをお探しですかdate -d "$day/$month/$year"? 例えば

    $ date -d "08/10/2014"
    Sun Aug 10 00:00:00 CEST 2014
    

    または、特定の月のカレンダーを表示する場合:

    $ cal 10 2014
        October 2014      
    Su Mo Tu We Th Fr Sa  
              1  2  3  4  
     5  6  7  8  9 10 11  
    12 13 14 15 16 17 18  
    19 20 21 22 23 24 25  
    26 27 28 29 30 31     
    

関連情報