我有这个变量,我想删除前缀和后缀:
var="abcde"
echo "${${var#a}%e}"
我在 zsh 中尝试了这个片段,它工作正常 - returns bcd
。它使用模式匹配(前缀和后缀)。虽然,当我在 posix 兼容的 shell 脚本中运行它时(我使用模式匹配而不是 bash 字符串操作的原因),我得到了输出bad substitution
。
什么事?我必须创建另一个变量来存储"${var#a}"
还是可以在一行中完成?我想要 posix 兼容的脚本。
答案1
不,您不需要另一个变量,是的,您可以在一行中完成。
这可能是最便携的解决方案,但它会覆盖变量值(仍然使用问题中提到的单个变量)。它仅使用 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$//'
您仅提供了示例,没有任何模式匹配。请记住,一旦模式匹配成为一件事,您可能会看到一种解决方案比另一种更好,具体取决于模式的复杂性。