算術拡張(先行ゼロ)でテスト

算術拡張(先行ゼロ)でテスト

次のksh88コードは、月[m]と年[y]の値を取り、先月の年[p_m]と先月[p_m_y]を計算します。

m は元の date コマンドから出てくるので、現在の月が 10 より小さい場合は前に 0 が付きます。

m=02
y=2017

if [ $((m-1)) -gt 1 ]
then
    p_m=$((m-1))
    p_m_y=$((y))
else
    p_m=12
    p_m_y=$((y-1))
fi

この例では、p_mは12に設定され、p_m_yは2016なので、ifステートメントは失敗したように見え、mが1より大きい場合でも常に "else"コードを実行します。前にゼロを付けるのが問題かもしれないと思いますか? [[..]]を使っても同じことが起こります。

次のように変更すると機能します。

if [[ $((m-1)) != 01 ]]

おそらくこれは文字列比較です。算術比較は機能しません。大きな問題ではなく、まだ解決できます。

ただし、正しい算術を使用してこれを操作する方法が必要です。 Base10拡張を強制しようとすると、何の効果もありません。

if [[ $((10#$m-1)) -gt 1 ]]

ベストアンサー1

月が1 =>先月=> 12で年が減少したときに呼び出されるdc電卓を使用します。macro aそれ以外の場合は年を減らします。

m=01
y=2011

set X `echo "[sa 1- 12]sa $y $m d1- r1- r0 =af" | dc`; shift

p_m=$1  p_m_y=$2

echo "Current month:$m   Current year: $y"
echo "   Prev month:$p_m Prev month year: $p_m_y"

おすすめ記事