提问人:kr_devops 提问时间:4/1/2022 更新时间:4/2/2022 访问量:458
Bash:如何只更改一个参数值并保持其他参数值保持不变
Bash: How to change only one parameter value and keep the other remain same
问:
我有一个 bash 脚本,它编辑 yaml 文件中的两个标签,这些值作为参数传递。如何更改只需要更新一个标签的方案的脚本
#!/bin/bash
#Update UI-ImageTag
sed -i -e '/APP:/{n;n;s/\(imageTag\).*/\1: "'"app-ui-$1"'" /}' \
-e '/APP:/{n;n;n;n;s/\(imageTag\).*/\1: "'"app-db-$2"'" /}' \
values.yaml
在运行脚本并传递参数 $1 和 $2 Ex(./script.sh 1.0 2.0) 的值时,两个标签都会在 values.yaml 文件中更新,但是当我只为一个参数提供值而将另一个参数留空时(即,通过仅传递 $1 的值来执行脚本),则 values.yaml 文件中的 $2 标签将替换为空值。 如何更改脚本,以便在我不需要更改 app-db 的标签并且如果我不传递 $2 的值的情况下,它会保持 yaml 文件中的旧值不变
答:
1赞
tripleee
4/1/2022
#1
您可以要求 shell 在未设置某些内容时提供默认值,只需更改脚本以捕获旧值并替换为该值,这样您实际上不会更改任何内容。sed
#!/bin/bash
sed -i -e '/APP:/{n;n;s/\(imageTag\).*/\1: "'"app-ui-$1"'" /}' \
-e '/APP:/{n;n;n;n;s/\(imageTag\)\(.*\)/\1: "'"${2+app-db-}${2-\\2}"'" /}' \
values.yaml
参数扩展将扩展为仅设置时,并扩展为未设置时,以及设置时扩展为其值。您会注意到,正则表达式也略有更改,以捕获 into 之后的文本。${2+value}
value
$2
${2-\\2}
\2
imageTag
\2
评论
0赞
kr_devops
4/1/2022
当未设置 2 美元时,它工作正常,但是当我传递 2 美元的值时,它会两次获取该值。示例:如果我将 $2 值作为 2.0 传递,则结果为“app-db-2.02.0”,但相反,我想要类似 app-db-2.0 的东西
0赞
tripleee
4/2/2022
哎呀,感谢您的错误报告;更新。
0赞
Dudi Boy
4/2/2022
#2
建议尝试脚本:awk
awk '
/APP:/{skip2 = 3; skip4 = 5}
!skip2 && inp1 {$0 = gensub("(imageTag)","\\1: \"app-ui-"inp1"\" \\\\",1)}
!skip4 && inp2 {$0 = gensub("(imageTag)","\\1: \"app-db-"inp2"\" \\\\",1)}
{print; --skip2; --skip4}
' inp1="$1" inp2="$2" values.yaml > values.yaml.1
mv values.yaml.1 values.yaml
未测试,未提供示例数据。
解释:
awk ' # start awk script
/APP:/ { # for evey line matching RegExp /APP:/ set down counter to skipped line
skip2=3; # set skip2 action to next 2 lines including this is 3
skip4=5; # set skip4 action to next 4 lines including this is 5
}
skip2 == 0 && inp1 { # in current line, if skip2 reached 0, and variable inp1 exist
$0 = gensub("(imageTag)","\\1: \"app-ui-"inp1"\" \\\\",1); # do string subtition using gensub functin on current line.
}
skip4 == 0 && inp2 { # in current line, if skip4 reached 0, and variable inp2 exist
$0 = gensub("(imageTag)","\\1: \"app-db-"inp2"\" \\\\",1); # do string subtition using gensub functin on current line.
}
{ # on every line
print $0; # print current line
--skip2; # decrement skip2
--skip4; # decrement skip4
}' \ # end awk script
inp1="$1" \ # assign 1st script argument to awk variable inp1
inp2="$2" \ # assign 2nd script argument to awk variable inp1
values.yaml > values.yaml.1 # redirect output to values.yaml.1
mv values.yaml.1 values.yaml # override output to values.yaml
评论