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