在 bash 脚本参数中转义正斜杠以进行 sed 替换

在 bash 脚本参数中转义正斜杠以进行 sed 替换

我想采用像这样带有正斜杠的 bash 脚本参数my_server/my_repo/my_image,并将它们传递到一个sed函数中,该函数对字符串进行替换并重写不同的文件。

我可以通过在设置字符串时转义正斜杠来做到这一点,如下所示:

#!/usr/bin/bash

IMAGE_NAME="my_server\/my_repo\/my_image"
CURRENT_VERSION="1.0.0"
TARGET_VERSION="1.0.1"
TARGET_FILE="./my_deployment.yaml"

sed -i "s/$IMAGE_NAME:$CURRENT_VERSION/$IMAGE_NAME:TARGET_VERSION/" "$TARGET_FILE"

这很好,但是当我传递相同的字符串时,无论是转义还是未转义,我都无法让它工作。我很确定这是因为变量在命令中$IMAGE_NAME没有转义while ,这在进行替换时完全消失了。/sedsed

我尝试过各种组合来逃避争论和逃避:

> ./myscript.sh my_server/my_repo/my_image
> ./myscript.sh my_server\/my_repo\/my_image

将参数分配给$IMAGE_NAME其他组合时转换参数。

> IMAGE_NAME=$1
> IMAGE_NAME="$1"
> IMAGE_NAME=`echo $1 | sed 's/\//\\\//g'`

我确信这与 bash 如何处理字符串和转义有关,但我不知道如何进行。

那么,如何获取像这样作为参数传递的字符串:

my_server/my_repo/my_image

从变量调用时输出:

my_server\/my_repo\/my_image    

答案1

您需要通过使用引号或将其加倍来保护命令行上的 shell 免受反斜杠的影响。

myscript.sh 
'my_server\/my_repo\/my_image'
..... Or
myscript.sh my_server\\/my_repo\\/my_image

相关内容