Bash
將變數設置為除法和減法命令的結果
我正在嘗試以紀元形式獲取 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 ))
dayleft=$(bc -l <<< "scale=2; 100/3")
正如Stéphane Chazelas在評論中所述,
ksh93
,zsh
和yash
確實支持$((...))
和中的浮點數((...))
。
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 <<< "scale=2; (todayepoch - expiryepoch) / 86400")