Shell-Script
模式匹配 shell 腳本中的後綴和前綴
我有這個變數,我想刪除前綴和後綴:
var="abcde" echo "${${var#a}%e}"
我在 zsh 中嘗試了這個片段,它工作正常 - 返回
bcd
. 它使用模式匹配(前綴和後綴)。雖然,當我在 posix 兼容的 shell 腳本中執行它時(我使用模式匹配而不是 bash 字元串操作的原因),我得到了 outputbad substitution
。有什麼事?我必須製作另一個變數來儲存
"${var#a}"
還是可以在一行中完成?我想要 posix 兼容的腳本。
不,您不需要另一個變數,是的,您可以在一行中完成。
這可能是最便攜的解決方案,但它會覆蓋變數值(仍然使用問題中提到的單個變數)。它僅使用 shell 語言的參數擴展:
var="abcde" var="${var#a}" # remove prefix echo "${var%e}" # remove suffix
可以始終創建單線,如下所示:
var="abcde"; var="${var#a}"; echo "${var%e}"
如果您不想覆蓋變數,函式參數是完美的臨時變數。儘管您的範例很簡單,但您可以為其創建一個函式,該函式隱藏使用的額外變數。這種方法特別有用,因為 POSIX shell 中沒有局部變數:
# this function runs in a subshell, so all new variables are lost on the return remove_pre_post() ( local_var="${1#a}" # uses the first argument echo "${local_var%e}" ) var="abcde" remove_pre_post "$var" # call function
另一個符合 POSIX 標準的解決方案可能涉及
sed
:var="abcde" echo "$var" | sed 's/^a//; s/e$//'
您只提供了沒有任何模式匹配的範例。請記住,一旦模式匹配成為一件事,您可能會看到一個解決方案比另一個解決方案更好,具體取決於模式複雜性。