我有一个脚本,它有一个case语句,我希望根据变量的值执行。 case语句似乎忽略该值或者没有正确评估它而是降低到默认值。
我从服务器主机名中提取一个特定字符,指示服务器所在环境中的位置。我们有六个不同的位置:
从主机名中提取字符后,我将其传递给一个案例块。我希望case块来评估字符并在rsyslog.conf文件中添加几行文本。发生的事情是case块返回默认值,它只会告诉构建服务器的人由于无法识别的字符而手动配置条目。
我已经针对我最近构建的服务器手动测试了这个,并且验证了我从主机名(一个's')提取的字符是预期的并且在case块中计算。
# Determine which environment our server resides in
host=$(hostname -s)
env=${host:(-8):1}
OLDFILE=/etc/rsyslog.conf
NEWFILE=/etc/rsyslog.conf.new
# This is the configuration we need on every server regardless of environment
read -d '' common <<- EOF
...
TEXT WHICH IS ADDED TO ALL CONFIG FILES REGARDLESS OF FURTHER CODE EXECUTION
SNIPPED
....
EOF
# If a server is in the Management, Dev or Test environments send logs to lg01
read -d '' lg01conf <<- EOF
# Relay messages to lg01
*.notice @@xxx.xxx.xxx.100
#### END FORWARDING RULE ####
EOF
# If a server is in the Imp, Prod or is a non-affiliated Services zone server send logs to lg02
read -d '' lg02conf <<- EOF
# Relay messages to lg02
*.notice @@xxx.xxx.xxx.101
#### END FORWARDING RULE ####
EOF
# The general rsyslog configuration remains the same; pull it out and write it to a new file
head -n 63 $OLDFILE > $NEWFILE
# Add the common language to our config file
echo "$common" >> $NEWFILE
# Depending on which environment ($env) our server is in, add the appropriate
# remote log server to the configuration with the $common settings.
case $env in
m) echo "$lg01conf" >> $NEWFILE;;
d) echo "$lg01conf" >> $NEWFILE;;
t) echo "$lg01conf" >> $NEWFILE;;
i) echo "$lg02conf" >> $NEWFILE;;
p) echo "$lg02conf" >> $NEWFILE;;
s) echo "$lg02conf" >> $NEWFILE;;
*) echo "Unknown environment; Manually configure"
esac
# Keep a dated backup of the original rsyslog.conf file
cp $OLDFILE $OLDFILE.$(date +%Y%m%d)
# Replace the original rsyslog.conf file with the new version
mv $NEWFILE $OLDFILE
我已经确定我可以将case块中的不同代码组合并到单行(总共两行)中。运营商。我已经按照上面的方式列出了它,因为这是我在遇到问题时的编码方式。
答案 0 :(得分:1)
我看不出你的代码有什么问题。也许在默认子句中添加另一个;;
。要查找问题,请添加set -vx
作为第一行。将向您显示大量调试信息。