Shell虽然是脚本语言,但我们也不能忽略其优雅的编程风格,下面是一些小的书写习惯。
- 将命令或命令组合设为一个见名知意的别名,在一个Shell环境中可以被多次调用,同时,利于代码的清晰度,也便于代码的阅读。 通常封装在一个库文件中,比如:demo.lib
#! /bin/sh
alias LOCAL='local'
alias GLOBAL=''
alias OPEN_DEBUG='set -x'
alias CLOSE_DEBUG='set +x'
alias GET_IP_FQDN='nslookup ${IP_ADDRESS} | tail -n 2 | sed -e "$d" | awk -F[=] "{print \$NF}" | sed -e "s/^\s*//" -e "s/\.$//"'
- 将属性键值对,配置在文件中,供Shell读取,以此达到配置与代码的剥离,也避免程序的硬编码,比如:info.conf
NAME="Zhou Shengshuai"
COMPANY="ZSS"
如何执行lib中的alias呢? 又如何读取info.conf中的属性值呢?下面的demo.sh一目了然。
#! /bin/sh
# 在当前进程中,Source参数文件demo.lib中的各个命令
source demo.lib
# 全局变量IP_ADDRESS,在当前Shell环境中,可以被demo.lib共享,即:IP_ADDRESS可以在demo.lib被使用
GLOBAL IP_ADDRESS="10.91.86.250"
# 执行当前Shell环境中的命令,即:demo.lib中的GET_IP_FQDN
GLOBAL IP_FQDN=`GET_IP_FQDN`
echo "IP FQDN: ${IP_FQDN}"
# 执行当前Shell环境中的命令,即:demo.lib中的OPEN_DEBUG
OPEN_DEBUG
# 在当前进程中,读取参数文件info.conf中的各个属性值
CONF_FILE="info.conf"
[ -e ${CONF_FILE} ] && source ${CONF_FILE}
echo "NAME: $NAME"
echo "COMPANY: $COMPANY"
function test1{
# 局部变量,生存周期在函数体内
LOCAL v1=100
}
test1
echo "local variable: $v1"
function test2
{
# 全局变量,生存周期从函数调用开始被Shell环境共享
GLOBAL v2=200
}
test2
echo "global variable: $v2"
# 执行当前Shell环境中的命令,即:demo.lib中的CLOSE_DEBUG
CLOSE_DEBUG
# 将整个EOF"内容段"作为命令输入
cat >output.txt << EOF
ABCDEFGHIJKLMNOPQRSTUVWXYZ
EOF