Bash

將變數設置為除法和減法命令的結果

  • June 29, 2020

我正在嘗試以紀元形式獲取 2 個日期的差異並將數字轉換回天數:

EXPIRYEPOCH=$(date --date="$EXPIRYDATE" +%s)
TODAYEPOCH=$(date --date="$TODAYSDATE" +%s)
DAYSLEFT=$(expr ($EXPIRYEPOCH - $TODAYEPOCH) / 86400 )

上述DAYSLEFT評估失敗 - 而單次減法評估在以下情況下成功:

DAYSLEFT=$(expr $EXPIRYEPOCH - $TODAYEPOCH)

DAYSLEFT使用減法後除法設置變數的正確格式是什麼?

像這樣(不要再使用過時的expr):

dayleft=$(( arithmetic expression ))

如果您在bash中需要浮點數,請改用bc

dayleft=$(bc -l <<< "scale=2; 100/3")

正如Stéphane Chazelas在評論中所述,ksh93,zshyash確實支持$((...))和中的浮點數((...))

expr是古代shell程式碼中用來做數學的程序。在 bash 這樣的 Posix shell 中,使用$(( expression )). 在 bash、ksh88+、mksh/pdksh 或 zsh 中,您還可以使用(( expression ))let expression


((...))是一個算術命令,如果表達式非零,則返回退出狀態 0,如果表達式為零,則返回 1。如果需要副作用(分配),也用作“讓”的同義詞。見http://mywiki.wooledge.org/ArithmeticExpression


$((...))是算術代換。完成算術運算後,整個事情都被表達式的值所取代。見http://mywiki.wooledge.org/ArithmeticExpression


命令替換:"$(cmd "foo bar")"使用參數 ‘foo bar’ 執行命令 ‘cmd’"$(..)"並將被輸出替換。請參閱http://mywiki.wooledge.org/BashFAQ/002>和<http://mywiki.wooledge.org/CommandSubstitution


避免使用大寫變數,它們保留給系統使用


最後

expiryepoch=$(date --date="$expirydate" +%s)
todayepoch=$(date --date="$todaysdate" +%s)
dayleft=$(bc &lt;&lt;&lt; "scale=2; (todayepoch - expiryepoch) / 86400")

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