Bash 4.2 增加了對負子字串長度的支援:
http://tldp.org/LDP/abs/html/abs-guide.html#SUBSTREXTR01
實施例37-12。字串提取構造中的負參數
當“length”參數為負數時,它用作距末端的偏移量參數。
例如,在 Ubuntu 上測試時,以下輸出“World”:
STR="Hello World!"
echo ${STR:6:-1}
但在 OS X(GNU bash,版本 4.3.42(1)-release (x86_64-apple-darwin14.5.0))中,此用法會產生下列錯誤:
-1: substring expression < 0
這是 OS X 特有的,還是在後來的 bash 更新中再次停用?有沒有辦法為 OS X 啟用此功能?
答案1
雖然 flabdablet 的解決方案僅適用於固定長度的字串,但您可以使用它作為動態大小的字串的直接替代品:
echo ${STR:6:$((${#STR} - 6 - 1))}
詳細地:
${#STR}
傳回字串的長度。$((a - b - c))
做數學減法${STR:start:len}
傳回一個子字串。
因此,子字串表達式的第二個參數的組合是字串的長度減去起始偏移量再減去您在較新的 bash 語法中指定為負值的值。
答案2
如果保證 STR 至少包含 7 個字符,則 ${STR:6:${#STR}-7} 應該是 ${STR:6:-1} 的有效替代品。如果它可以更短,這也會導致 OS X bash 抱怨負長度,或者在支援負長度被視為從右偏移量的 bash 版本上出現嚴重錯誤。
答案3
透過使用長度作為輸入進行計算,可以動態地在末端進行切割。
${STR:0:${#STR}-2}
-2 是負數。