【发布时间】:2011-08-18 03:58:02
【问题描述】:
我有一个环境变量文件,我在 shell 脚本中获取,例如:
# This is a comment
ONE=1
TWO=2
THREE=THREE
# End
在我的脚本中,我将此文件(假设它称为“./vars”)导入当前环境,并根据用户输入更改(部分)变量。例如:
#!/bin/sh
# Read variables
source ./vars
# Change a variable
THREE=3
# Write variables back to the file??
awk 'BEGIN{FS="="}{print $1=$$1}' <./vars >./vars
如您所见,我一直在尝试使用 awk 将变量写回,sed 也是如此。没有成功。脚本的最后一行失败。有没有办法用 awk 或 sed 来做到这一点(最好保留 cmets,甚至是带有 '=' 字符的 cmets)?或者我应该在一个while循环或其他一些魔法中将“读取”与字符串切割结合起来?如果可能的话,我想避免使用 perl/python,而只使用 Busybox 中可用的工具。非常感谢。
编辑:也许一个用例可以说明我的问题是什么。我保留了一个由 shell 环境变量声明组成的配置文件:
# File: network.config
NETWORK_TYPE=wired
NETWORK_ADDRESS_RESOLUTION=dhcp
NETWORK_ADDRESS=
NETWORK_ADDRESS_MASK=
我还有一个名为“setup-network.sh”的脚本:
#!/bin/sh
# File: setup-network.sh
# Read configuration
source network.config
# Setup network
NETWORK_DEVICE=none
if [ "$NETWORK_TYPE" == "wired" ]; then
NETWORK_DEVICE=eth0
fi
if [ "$NETWORK_TYPE" == "wireless" ]; then
NETWORK_DEVICE=wlan0
fi
ifconfig -i $NETWORK_DEVICE ...etc
我还有一个名为“configure-network.sh”的脚本:
#!/bin/sh
# File: configure-network.sh
# Read configuration
source network.config
echo "Enter the network connection type:"
echo " 1. Wired network"
echo " 2. Wireless network"
read -p "Type:" -n1 TYPE
if [ "$TYPE" == "1" ]; then
# Update environment variable
NETWORK_TYPE=wired
elif [ "$TYPE" == "2" ]; then
# Update environment variable
NETWORK_TYPE=wireless
fi
# Rewrite configuration file, substituting the updated value
# of NETWORK_TYPE (and any other updated variables already existing
# in the network.config file), so that later invocations of
# 'setup-network.sh' read the updated configuration.
# TODO
如何重写配置文件,只更新配置文件中已经存在的变量,最好保持 cmets 和空行不变?希望这能澄清一点。再次感谢。
【问题讨论】: