如何通过另一个Shell脚本修改Housekeeping.sh的ARCHIVE_SWITCH变量
需求场景与问题描述
我编写了Housekeeping.sh脚本,其中包含ARCHIVE_SWITCH开关变量:当该变量值为1时,脚本会执行指定的sqlplus命令;值为0则不执行。Housekeeping.sh的代码如下:
ARCHIVE_SWITCH=1 if [[ $ARCHIVE_SWITCH -eq 1 ]]; then sqlplus ${BPS_SCHEMA}/${DB_PASSWORD}@${ORACLE_SID} @${BATCH_HOME}/sql/switch_archive.sql fi
现在希望创建一个可手动执行的Shell脚本,每次执行时能将ARCHIVE_SWITCH变量的值改为0,请问有哪些可行的实现方法?
可行实现方法
方法1:用sed命令直接替换文件内容
这是最直接的修改方式,通过sed精准匹配ARCHIVE_SWITCH的赋值行并替换目标值。创建名为disable_archive.sh的脚本:
#!/bin/bash # 替换为你的Housekeeping.sh实际路径 TARGET_SCRIPT="/absolute/path/to/Housekeeping.sh" # 执行替换操作 sed -i 's/^ARCHIVE_SWITCH=1/ARCHIVE_SWITCH=0/' "$TARGET_SCRIPT" # 验证修改结果 if grep -q "^ARCHIVE_SWITCH=0" "$TARGET_SCRIPT"; then echo "已成功将ARCHIVE_SWITCH设置为0" else echo "修改失败,请检查目标脚本路径或变量格式" fi
给脚本添加执行权限:chmod +x disable_archive.sh,执行即可完成修改。
方法2:将开关变量独立到配置文件
如果后续需要频繁调整开关状态,建议把ARCHIVE_SWITCH从主脚本分离到单独配置文件,避免频繁修改主脚本逻辑:
- 修改
Housekeeping.sh,引入外部配置:
# 引入配置文件,替换为你的实际路径 source /path/to/housekeeping_config.conf if [[ $ARCHIVE_SWITCH -eq 1 ]]; then sqlplus ${BPS_SCHEMA}/${DB_PASSWORD}@${ORACLE_SID} @${BATCH_HOME}/sql/switch_archive.sql fi
- 创建
housekeeping_config.conf配置文件:
ARCHIVE_SWITCH=1
- 编写
disable_archive.sh修改配置:
#!/bin/bash CONFIG_FILE="/path/to/housekeeping_config.conf" sed -i 's/^ARCHIVE_SWITCH=1/ARCHIVE_SWITCH=0/' "$CONFIG_FILE" grep -q "^ARCHIVE_SWITCH=0" "$CONFIG_FILE" && echo "归档开关已禁用" || echo "修改失败"
方法3:用awk命令替换(兼容多系统)
如果需要兼容不同操作系统(如BSD和GNU环境下sed -i参数差异),可以用awk实现替换,先写入临时文件再覆盖原文件:
#!/bin/bash TARGET_SCRIPT="/absolute/path/to/Housekeeping.sh" # 处理内容并写入临时文件,再替换原文件 awk '/^ARCHIVE_SWITCH=1/{print "ARCHIVE_SWITCH=0"; next}1' "$TARGET_SCRIPT" > temp_script && mv temp_script "$TARGET_SCRIPT" # 验证结果 if grep -q "^ARCHIVE_SWITCH=0" "$TARGET_SCRIPT"; then echo "修改成功" else echo "修改失败" fi
内容的提问来源于stack exchange,提问作者Elijah Leis
相关产品推荐
相关产品推荐

