Shell-Script

模式匹配 shell 腳本中的後綴和前綴

  • March 10, 2021

我有這個變數,我想刪除前綴和後綴:

var="abcde"
echo "${${var#a}%e}" 

我在 zsh 中嘗試了這個片段,它工作正常 - 返回bcd. 它使用模式匹配(前綴和後綴)。雖然,當我在 posix 兼容的 shell 腳本中執行它時(我使用模式匹配而不是 bash 字元串操作的原因),我得到了 output bad 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$//'

您只提供了沒有任何模式匹配的範例。請記住,一旦模式匹配成為一件事,您可能會看到一個解決方案比另一個解決方案更好,具體取決於模式複雜性。

引用自:https://unix.stackexchange.com/questions/637669