0

我需要在 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

4

2 回答 2

4

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

但是您可以使用许多外部助手中的任何一个来做到这一点;这是一个使用示例sed

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

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

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

于 2018-12-08T07:42:58.117 回答
3

使用参数扩展:

$ 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
于 2018-12-08T14:36:59.003 回答