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 ))