如何在Bash脚本中更新变量值并写入文件?解决sed命令异常问题
解决Bash脚本中指定变量值的更新问题
问题背景
需要更新Bash脚本里VARIABLE_KEY变量的值并写入原文件,但尝试的多个sed命令均失败,出现变量键丢失或值被清空的问题。
之前尝试的错误命令
sed -ri 's|^(VARIABLE_KEY\s*=\s*).*|\new_java-microservice.jar|' path_to_file/bashscript.sh sed -i "s#\(.*VARIABLE_KEY =\)\( .*\)#\1 \"new_java-microservice.jar\"#" path_to_file/bashscript.sh sed -i 's/VARIABLE_KEY =.*/VARIABLE_KEY =\"new_java-microservice.jar\"/' path_to_file/bashscript.sh
目标脚本内容
#!/bin/bash COMMAND="$1" HOME="/root/service/" BASE="${HOME}/javaservice" VARIABLE_KEY="existing-java.jar" case "${COMMAND}" in "start") nohup java -jar ${BASE}/${VARIABLE_KEY} start > /dev/null 2>&1 & ;; "stop") #.... ;; *) echo "Usage: $0 {start|stop}" ;; esac
错误原因分析
- 第一条命令:替换时未保留捕获的
VARIABLE_KEY=部分,直接用新值覆盖整行,导致变量键丢失。 - 第二条命令:
.*VARIABLE_KEY =会匹配行首到VARIABLE_KEY =的所有内容,可能误匹配其他行,且空格匹配过于严格,变量与=之间无空格时会失效。 - 第三条命令:转义引号的写法多余,且未处理变量与
=之间多空格的场景。
正确的sed命令
精准匹配带引号的值(推荐)
这条命令会精准匹配双引号包裹的变量值,保留变量键及等号周围的空格:
sed -i 's/^\(VARIABLE_KEY\s*=\s*\)"[^"]*"/\1"new_java-microservice.jar"/' path_to_file/bashscript.sh
^确保只匹配行首以VARIABLE_KEY开头的定义行\(VARIABLE_KEY\s*=\s*\)捕获变量名、等号及周围任意空格"[^"]*"匹配原变量的双引号包裹值\1"new_java-microservice.jar"保留捕获的键部分,替换为新的带引号值
通用兼容版(支持无引号/单引号值)
如果变量值可能不带引号或用单引号,用这条命令直接替换等号后的所有内容:
sed -i 's/^\(VARIABLE_KEY\s*=\s*\).*/\1"new_java-microservice.jar"/' path_to_file/bashscript.sh
执行后效果
脚本中VARIABLE_KEY行将被更新为:
VARIABLE_KEY="new_java-microservice.jar"
内容的提问来源于stack exchange,提问作者endlessCode
相关产品推荐
相关产品推荐

