/bin/dash:替换错误

/bin/dash: Bad substitution

我需要在 shell 脚本 (/bin/dash) 中进行字符串操作:

#!/bin/sh

PORT="-p7777"
echo $PORT
echo ${PORT/p/P}

最后一个回显失败 Bad substitution。当我将 shell 更改为 bash 时,它起作用了:

#!/bin/bash

PORT="-p7777"
echo $PORT
echo ${PORT/p/P}

如何在 dash 中实现字符串替换?

您正在使用的替换不是基本的 POSIX 功能(请参阅 here,在第 2.6.2 节参数扩展中),并且 dash 没有实现它。

但是您可以使用许多外部助手中的任何一个来完成;这是一个使用 sed:

的例子
PORT="-p7777"
CAPITOLPORT=$(printf '%s\n' "$PORT" | sed 's/p/P/')
printf '%s\n' "$CAPITOLPORT"

顺便说一句,请注意我使用的是 printf '%s\n' 而不是 echo —— 这是因为 echo 的某些实现在第一个参数以“-”开头时会做不可预测的事情。 printf 使用起来有点复杂(你需要一个格式字符串,在本例中是 %s\n)但更可靠。我还用双引号引用了所有变量引用("$PORT" 而不仅仅是 $PORT),以防止意外解析。

我还建议切换到小写或混合大小写变量。有大量具有特殊含义的全大写变量,如果您不小心使用其中一个,可能会导致问题。

使用参数扩展:

$ cat foo.sh
#!/bin/sh

PORT="-p7777"
echo $PORT
echo ${PORT:+-P${PORT#-p}}

PORT=""
echo $PORT
echo ${PORT:+-P${PORT#-p}}

运行它:

$ /bin/sh foo.sh
-p7777
-P7777

更新:

$ man dash:
- - 
${parameter#word}     Remove Smallest Prefix Pattern.

$ echo ${PORT#-p}
7777

$ man dash
- - 
${parameter:+word}    Use Alternative Value.

$ echo ${PORT:+-P${PORT#-p}}
-P7777