我有一个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标记会替换为空值。如何更改脚本,以便在我不需要更改应用程序数据库的标签的情况下,如果我不传递2美元的值,它会保持yaml文件中的旧值不变
当某个东西未设置时,您可以要求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
仅当设置了$2
时,参数扩展${2+value}
才会扩展到value
,当未设置时,${2-\2}
会扩展到2
,当设置时会扩展到其值。您会注意到,正则表达式也做了一些更改,以便将imageTag
之后的文本捕获到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