[英]Bash parameter expansion from both sides
我正在以 p=$1234.56 的形式從文件中獲取美元值到變量中,並希望刪除 $ 和小數位以在我的條件下獲取整數值,例如
if [[ ${p%%.*} < 1000]]; then p=${p}0; fi
但這並沒有刪除 $ 符號,我不想分兩步完成並修改實際變量,因為我需要 $ 供以后使用。 無論位數如何,如何獲取整數值,即($2.2,$123456.1234...)?
不幸的是,在一般情況下,如果您需要刪除多個模式,則無法避免執行多個參數擴展。
在像這樣的簡單情況下,您可以通過分配回同一個變量來避免臨時變量。
p=${p#\$}
p=${p%.??}
當然,在您的特定場景中,您可以全局替換任何非數字字符,並接受該數字將乘以 100。然后您顯然需要將您比較的數字相應地相乘。
if [[ ${p//[!0-9]/} < 100000 ]]
當然,要使其工作,您需要確保變量的值符合您的期望。 如果值可能具有不同的小數位數,具體取決於用戶傳入的內容或您從何處讀取輸入,您需要執行額外的規范化,或者完全使用不同的方法(通常您會將輸入傳遞給 Awk 或bc
支持浮點數學,與 shell 不同)。
但是,字符串替換參數擴展${variable//pattern/replacement}
是 Bash 擴展,不能移植到 Bourne/POSIX sh
。
不修改 var 是不可能的。 但是您可以使用帶有sed
之類的子shell 進程
if [[ $(sed 's/\$\([0-9]*\)\..*/\1/' <<< $p) < 1000 ]]; then p=${p}0; fi
另一種選擇是使用cut
命令提取點之前的子字符串(如果有的話)。 然后你可以這樣說:
p='$1234.56'
[[ $(cut -d. -f1 <<< "${p#\$}") < 1000 ]] && p=${p}0
echo "$p"
順便說一句,表達式[[ str1 < str2 ]]
執行字典比較,意思是[[ 20 < 1000 ]]
返回false
,因為20
按字典順序在1000
之后排序。
如果你想做的是算術比較,你需要說[[ val1 -le val2 ]]
或(( val1 < val2 ))
例如:
p='$1234.56'
[[ $(cut -d. -f1 <<< "${p#\$}") -le 1000 ]] && p=${p}0
echo "$p"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.