文字列を比較できません

文字列を比較できません

Googleは私を助けてくれませんでした。

#!/bin/sh

j1=`expr "$1"`
j2=`expr "$2"`

while [ $j1 -le $j2 ]; do
    date=$(ncal -e $j1)
    month=$($date | cut -f1 -d' ')
    if [ $month=="April" ]; then
        echo $date
    fi
        j1=`expr $j1 + 1`
done

イースターの日付を、4 月の年 (引数として渡した 2 年の範囲内) のみに印刷したいのですが、どういうわけか次のような出力になります。

...

April 5 2015
./script.sh: 8: March: not found
March 27 2016
./script.sh: 8: April: not found
April 16 2017

「月: 見つかりません」とはどういう意味ですか? また、4 月だけを要求しているのに、なぜ 3 月と印刷されるのですか?

いろいろな方法を試してみましたが、常に何らかのエラーが発生しました。

また、4 月 20 日以降の日付のみを印刷するという条件を追加する必要がありますが、これさえも処理できません。

答え1

ライン上で

month=$($date | cut -f1 -d' ')

にあるものはすべて$dateコマンドとして実行し、その出力を にパイプしますcut

あなたが望むのは

month=$( printf '%s\n' "$date" | cut -f 1 -d ' ' )

ここ。

$(...)また、同じスクリプト内でバックティックとを混在させないでください。混乱を招きます$(...)。代わりに を使用してください。

文字列の比較は次のように行います=:

if [ "$month" = "April" ]; then

変数は必ず二重引用符で囲んでください。bash/POSIX シェルで変数を引用符で囲み忘れた場合のセキュリティへの影響

整数演算は . を使用して実行できますが$(( expression ))exprこれは時代遅れです。

j1=$(( "$1" ))
j2=$(( "$2" ))

...

j1=$(( j1 + 1 ))

関連情報