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