/ bin /破折号:替代错误

时间:2018-12-08 07:26:56

标签: string bash sh dash-shell parameter-expansion

我需要在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中实现字符串替换?

2 个答案:

答案 0 :(得分:4)

您使用的替代方法不是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)双引号,以防止意外的解析。

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

答案 1 :(得分:2)

使用参数扩展:

$ 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