我需要在 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
?
我需要在 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 功能(请参阅此处,在第 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 ),以防止意外解析。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