我想采用像这样带有正斜杠的 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 ,这在进行替换时完全消失了。/
sed
sed
我尝试过各种组合来逃避争论和逃避:
> ./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