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\).*/: "'"app-ui-"'" /}' \
-e '/APP:/{n;n;n;n;s/\(imageTag\).*/: "'"app-db-"'" /}' \
values.yaml
虽然 运行 脚本和参数 $1 和 $2 Ex(./script.sh 1.0 2.0) 的传递值都在 values.yaml 文件中更新,但是当我只为一个参数赋值,将另一个参数留空(即,通过仅传递 $1 的值来执行脚本),然后 values.yaml 文件中的 $2 标记将替换为空值。
如何更改脚本,以便在我不需要更改 app-db 标签的情况下,如果我不传递 $2 的值,它会保持 yaml 文件中的旧值不变
您可以要求 shell 在某些内容未设置时提供默认值,只需更改您的 sed
脚本以捕获旧值并替换为该值,这样您就可以有效地避免不要改变任何东西。
#!/bin/bash
sed -i -e '/APP:/{n;n;s/\(imageTag\).*/: "'"app-ui-"'" /}' \
-e '/APP:/{n;n;n;n;s/\(imageTag\)\(.*\)/: "'"${2+app-db-}${2-\2}"'" /}' \
values.yaml
参数扩展${2+value}
仅在设置</code>时扩展为<code>value
,而${2-\2}
未设置时扩展为</code>,并且它设置时的值。为此,您会注意到正则表达式也略有更改,以将 <code>imageTag
之后的文本捕获到
。
建议尝试 awk
脚本:
awk '
/APP:/{skip2 = 3; skip4 = 5}
!skip2 && inp1 {[=10=] = gensub("(imageTag)","\1: \"app-ui-"inp1"\" \\",1)}
!skip4 && inp2 {[=10=] = gensub("(imageTag)","\1: \"app-db-"inp2"\" \\",1)}
{print; --skip2; --skip4}
' inp1="" inp2="" 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
[=11=] = 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
[=11=] = gensub("(imageTag)","\1: \"app-db-"inp2"\" \\",1); # do string subtition using gensub functin on current line.
}
{ # on every line
print [=11=]; # print current line
--skip2; # decrement skip2
--skip4; # decrement skip4
}' \ # end awk script
inp1="" \ # assign 1st script argument to awk variable inp1
inp2="" \ # 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
我有一个 bash 脚本可以编辑 yaml 文件中的两个标签,这些值作为参数传递。对于只需要更新一个标签的场景,我该如何更改脚本
#!/bin/bash
#Update UI-ImageTag
sed -i -e '/APP:/{n;n;s/\(imageTag\).*/: "'"app-ui-"'" /}' \
-e '/APP:/{n;n;n;n;s/\(imageTag\).*/: "'"app-db-"'" /}' \
values.yaml
虽然 运行 脚本和参数 $1 和 $2 Ex(./script.sh 1.0 2.0) 的传递值都在 values.yaml 文件中更新,但是当我只为一个参数赋值,将另一个参数留空(即,通过仅传递 $1 的值来执行脚本),然后 values.yaml 文件中的 $2 标记将替换为空值。 如何更改脚本,以便在我不需要更改 app-db 标签的情况下,如果我不传递 $2 的值,它会保持 yaml 文件中的旧值不变
您可以要求 shell 在某些内容未设置时提供默认值,只需更改您的 sed
脚本以捕获旧值并替换为该值,这样您就可以有效地避免不要改变任何东西。
#!/bin/bash
sed -i -e '/APP:/{n;n;s/\(imageTag\).*/: "'"app-ui-"'" /}' \
-e '/APP:/{n;n;n;n;s/\(imageTag\)\(.*\)/: "'"${2+app-db-}${2-\2}"'" /}' \
values.yaml
参数扩展${2+value}
仅在设置</code>时扩展为<code>value
,而${2-\2}
未设置时扩展为</code>,并且它设置时的值。为此,您会注意到正则表达式也略有更改,以将 <code>imageTag
之后的文本捕获到 。
建议尝试 awk
脚本:
awk '
/APP:/{skip2 = 3; skip4 = 5}
!skip2 && inp1 {[=10=] = gensub("(imageTag)","\1: \"app-ui-"inp1"\" \\",1)}
!skip4 && inp2 {[=10=] = gensub("(imageTag)","\1: \"app-db-"inp2"\" \\",1)}
{print; --skip2; --skip4}
' inp1="" inp2="" 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
[=11=] = 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
[=11=] = gensub("(imageTag)","\1: \"app-db-"inp2"\" \\",1); # do string subtition using gensub functin on current line.
}
{ # on every line
print [=11=]; # print current line
--skip2; # decrement skip2
--skip4; # decrement skip4
}' \ # end awk script
inp1="" \ # assign 1st script argument to awk variable inp1
inp2="" \ # 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