簡體   English   中英

bash參數從兩邊展開

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM