Bash案例没有正确评估价值

时间:2013-03-29 10:57:47

标签: bash switch-statement

问题

我有一个脚本,它有一个case语句,我希望根据变量的值执行。 case语句似乎忽略该值或者没有正确评估它而是降低到默认值。

情景

我从服务器主机名中提取一个特定字符,指示服务器所在环境中的位置。我们有六个不同的位置:

  • 管理(m):作为基础设施一部分的服务器,如监控,电子邮件,票务等
  • 开发(d):用于开发代码和应用程​​序功能的服务器
  • Test(t):用于初始测试代码和应用程​​序功能的服务器
  • 实施(i):推送代码以进行预生产评估的服务器
  • 生产(p):不言自明
  • 服务:客户需要集成的服务器,在其项目中提供功能。它们与管理服务器分开,因为它们是客户服务器,而管理服务器由我们拥有和运营。

从主机名中提取字符后,我将其传递给一个案例块。我希望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

An Aside

我已经确定我可以将case块中的不同代码组合并到单行(总共两行)中。运营商。我已经按照上面的方式列出了它,因为这是我在遇到问题时的编码方式。

1 个答案:

答案 0 :(得分:1)

我看不出你的代码有什么问题。也许在默认子句中添加另一个;;。要查找问题,请添加set -vx作为第一行。将向您显示大量调试信息。