算術擴展測試(前導零)
以下 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 > 1
相當於m > 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_y
。m
順便說一句,你說:
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"