任何代码会在野外被释放应具有以下短标题:
# Script to turn lead into gold
# Copyright (C) 2009 Joe Q Hacker - All Rights Reserved
# Permission to copy and modify is granted under the foo license
# Last revised 1/1/2009
保持更改日志中的代码头去,是从当版本控制系统是非常不方便的一个倒退。最后一次修改日期显示某人脚本有多大年纪。
如果您打算依赖bashisms,请使用#!/ bin/bash而不是/ bin/sh,因为sh是任何shell的POSIX调用。即使/ bin/sh指向bash,如果通过/ bin/sh运行它,许多功能也将被关闭。大多数Linux发行版都不会采用依赖bashisms的脚本,而是尝试移植。
对我来说,在shell脚本的意见是有点傻,除非他们读的东西,如:
# I am not crazy, this really is the only way to do this
shell脚本,就是这么简单,(除非你写一个示范,教别人如何做到这一点)的代码几乎总是消除自己。
一些shell不喜欢被输入的“本地”变量。我相信到今天,Busybox(一种常见的救援外壳)就是其中之一。改为使用GLOBALS_OBVIOUS,它更容易阅读,尤其是在通过/ bin/sh -x ./script.sh进行调试时。
我个人的偏好是让逻辑为自己说话,并尽量减少解析器的工作。例如,许多人可能会这样写:
if [ $i = 1 ]; then
... some code
fi
在哪里,我正:
[ $i = 1 ] && {
... some code
}
同样,有人可能会这样写:
if [ $i -ne 1 ]; then
... some code
fi
...这里我倒是:
[ $i = 1 ] || {
... some code
}
我唯一使用传统的if/th如果还有其他 - 如果投入混合,en/else。
只需在大多数使用autoconf的免费软件包中查看'configure'脚本,就可以研究非常好的可移植shell代码的一个令人毛骨悚然的例子。我说疯了,因为它的6300行代码满足了人们熟知的每个系统都有类似于UNIX的UNIX系统。你不想要那种臃肿,但研究一些内部的各种可移植性攻击是很有趣的,比如对那些可能指向/ bin/sh的人来说zsh :)
唯一的其他建议我可以给你看看你的扩展在这里,文档,即
cat <<EOF> foo.sh
printf "%s was here" "$name"
EOF
...将扩大$ name,当你可能想离开变量的地方。解决这个通过:
printf "%s was here" "\$name"
这将离开$ name作为变量,而不是扩大它。
我也强烈建议学习如何使用陷阱捕捉信号..并利用这些处理程序作为样板代码。通过一个简单的SIGUSR1告诉一个正在运行的脚本是非常方便的:)
我编写的大多数新程序(它们都是面向工具/命令行的)最初都是作为shell脚本开始的,它是一种用于UNIX工具原型的好方法。
您可能还喜欢SHC shell脚本编译器check it out here。
作者(s)?更新日志? 获取版本控制系统! – derobert 2009-01-10 06:04:18