Mar*_*ter 1 string bash sh parameter-expansion dash-shell
我需要在 shell 脚本 ( ) 中进行字符串操作/bin/dash:
#!/bin/sh
PORT="-p7777"
echo $PORT
echo ${PORT/p/P}
Run Code Online (Sandbox Code Playgroud)
最后一个回显失败并显示Bad substitution。当我将 shell 更改为 bash 时,它可以工作:
#!/bin/bash
PORT="-p7777"
echo $PORT
echo ${PORT/p/P}
Run Code Online (Sandbox Code Playgroud)
如何实现 中的字符串替换dash?
您使用的替换不是基本的 POSIX 功能(请参阅此处,第 2.6.2 节参数扩展),并且dash没有实现它。
但是您可以使用许多外部帮助者中的任何一个来完成此操作;这是一个使用的示例sed:
PORT="-p7777"
CAPITOLPORT=$(printf '%s\n' "$PORT" | sed 's/p/P/')
printf '%s\n' "$CAPITOLPORT"
Run Code Online (Sandbox Code Playgroud)
顺便说一句,请注意,我使用的是--printf '%s\n'而不是echo-- 这是因为echo当第一个参数以“-”开头时,某些实现会执行不可预测的事情。printf使用起来有点复杂(在这种情况下,您需要一个格式字符串%s\n),但更可靠。"$PORT"我还对所有变量引用(而不是仅仅)进行双引号$PORT,以防止意外解析。
我还建议切换到小写或混合大小写变量。有大量具有特殊含义的全大写变量,如果您不小心使用其中之一,可能会导致问题。