Ksh

算術擴展測試(前導零)

  • May 9, 2017

以下 ksh88 程式碼採用月份的值

$$ m $$和年份$$ y $$並在上個月鍛煉$$ p_m $$, 和上個月的年份$$ p_m_y $$. m 最初是從 date 命令派生的,因此如果目前月份 < 10,則前導零。

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 語句似乎失敗並始終觸發“else”程式碼….即使 m 大於 1。我認為前導零可能是問題? 如果我使用也會發生同樣的事情

$$ [ .. $$]. 如果我將其修改為以下內容,則可以使用

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

大概這現在是一個字元串比較,算術比較不起作用。不是一個大問題,我仍然可以解決這個問題。

但是應該有一種方法可以使用適當的算術使其工作。如果我嘗試強制 base10 擴展,它沒有任何效果。

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

您展示的具體範例中的問題不是m前導零 - 即使它被視為八進制,02仍然只是2. 您正在使用的測試是:

[ $((m-1)) -gt 1 ]

m-1 &gt; 1相當於m &gt; 2。由於2不大於2,因此else將執行該子句。您可以將測試更改為簡單

[ $m -gt 1 ]

但是直接使用 shell 的算術功能會簡單得多:

m=02
y=2017
p_m=$(( (m+10)%12 + 1 ))
p_m_y=$(( y - (m==1) ))

最後一點可能值得一些解釋:

對於p_m,我們使用模運算。 (m + 10)%12相當於“兩個月前(或十個月後),除了 12 月被列為 0”。然後我們添加一個以實現“上個月,在 1-12 範圍內”。

最後一行更簡單。 (m==1)要麼1如果m在數值上等於 1,否則0。如果不是 1,則設置為目前年份,否則設置為上一年p_m_ym


順便說一句,你說:

m 最初是從 date 命令派生的,因此如果目前月份 < 10,則具有前導零。

情況不一定如此。在我的系統上:

$ date
2017年  5月  9日 火曜日 13:58:53 EDT
$ LC_ALL=en_US.UTF-8 date
Tue May  9 13:58:53 EDT 2017
$ date '+%Y %m %d' | sed 's/ 0*/ /g'
2017 5 9

因此,如果您擔心數字被解釋為八進制,您可能想嘗試最後一個。

我們使用dc計算器,macro a當月份為 Jan. => prev month => 12 並且年份遞減時呼叫 。否則,我們只是減少年份。

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"

引用自:https://unix.stackexchange.com/questions/363938