You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

错误原因分析

  1. 第一条命令:替换时未保留捕获的VARIABLE_KEY=部分,直接用新值覆盖整行,导致变量键丢失。
  2. 第二条命令:.*VARIABLE_KEY =会匹配行首到VARIABLE_KEY =的所有内容,可能误匹配其他行,且空格匹配过于严格,变量与=之间无空格时会失效。
  3. 第三条命令:转义引号的写法多余,且未处理变量与=之间多空格的场景。

正确的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 15:24:16