/bin/dash:错误替换

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

Gor*_*son 5

您使用的替换不是基本的 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,以防止意外解析。

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