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