shell脚本样本_bash – shell脚本模板

我将Norman的答案扩展到6行,其中最后一行是空白的:

#!/bin/ksh

#

# @(#)$Id$

#

# Purpose

第三行是一个版本控制标识字符串 – 它实际上是一个SCCS标记’@(#)’的混合体,可以由(SCCS)程序识别什么和一个RCS版本字符串,当文件放在RCS,我用于私人使用的默认VCS. RCS程序ident获取$Id $的扩展形式,可能看起来像$Id:mkscript.sh,v 2.3 2005/05/20 21:06:35 jleffler Exp $.第五行提醒我脚本应该在顶部描述其目的;我用脚本的实际描述替换了这个单词(这就是为什么后面没有冒号的原因).

在那之后,shell脚本基本上没有标准.出现了标准片段,但没有出现在每个脚本中的标准片段. (我的讨论假定脚本是用Bourne,Korn或POSIX(Bash)shell表示法编写的.有一个完整的单独讨论,为什么任何人在#!sigil之后放置C Shell衍生物都是生活在罪中.)

例如,只要脚本创建中间(临时)文件,此代码就会以某种形式或形式出现:

tmp=${TMPDIR:-/tmp}/prog.$$

trap "rm -f $tmp.?; exit 1" 0 1 2 3 13 15

...real work that creates temp files $tmp.1,$tmp.2,...

rm -f $tmp.?

trap 0

exit 0

第一行选择一个临时目录,如果用户没有指定替代方法,则默认为/ tmp($TMPDIR被广泛认可并由POSIX标准化).然后,它会创建一个包含进程ID的文件名前缀.这不是一项安全措施;这是一个简单的并发度量,可以防止脚本的多个实例践踏彼此的数据. (为了安全起见,在非公共目录中使用不可预测的文件名.)第二行确保在shell收到任何信号SIGHUP(1),SIGINT(2)时执行’rm’和’exit’命令),SIGQUIT(3),SIGPIPE(13)或SIGTERM(15). ‘rm’命令删除与模板匹配的所有中间文件; exit命令确保状态为非零,表示存在某种错误. ‘陷阱’为0表示如果shell因任何原因退出,也会执行代码 – 它包含标记为“实际工作”的部分中的疏忽.最后的代码然后删除任何幸存的临时文件,然后在退出时解除陷阱,最后以零(成功)状态退出.显然,如果要退出其他状态,可以 – 只需确保在运行rm和trap行之前将其设置在变量中,然后使用exit $exitval.

我通常使用以下命令从脚本中删除路径和后缀,因此我可以在报告错误时使用$arg0:

arg0=$(basename $0 .sh)

我经常使用shell函数来报告错误:

error()

{

echo "$arg0: $*" 1>&2

exit 1

}

如果只有一个或两个错误退出,我不打扰该功能;如果还有,我这样做是因为它简化了编码.我还创建了或多或少精心设计的函数,用于给出如何使用命令的摘要 – 再次,只有在有多个地方才能使用它.

另一个相当标准的片段是一个选项解析循环,使用内置的getopts shell:

vflag=0

out=

file=

Dflag=

while getopts hvVf:o:D: flag

do

case "$flag" in

(h) help; exit 0;;

(V) echo "$arg0: version $Revision$($Date$)"; exit 0;;

(v) vflag=1;;

(f) file="$OPTARG";;

(o) out="$OPTARG";;

(D) Dflag="$Dflag $OPTARG";;

(*) usage;;

esac

done

shift $(expr $OPTIND - 1)

要么:

shift $(($OPTIND - 1))

“$OPTARG”周围的引号处理参数中的空格. Dflag是累积的,但这里使用的符号会丢失参数中的空格.有(非标准的)方法可以解决这个问题.

第一个移位符号适用于任何shell(或者如果我使用back-ticks而不是’$(…)’.第二个工作在现代shell中;甚至可能有替代方括号而不是括号,但是这是有效的,所以我不打算弄清楚那是什么.

现在最后一个技巧是我经常有GNU和非GNU版本的程序,我希望能够选择我使用的.因此,我的许多脚本都使用如下变量:

: ${PERL:=perl}

: ${SED:=sed}

然后,当我需要调用Perl或sed时,脚本使用$PERL或$SED.这有助于我在某些行为不同的情况下 – 我可以选择操作版本 – 或者在开发脚本时(我可以在不修改脚本的情况下为命令添加额外的仅调试选项).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值