文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>shell常用技巧及编程建议...

shell常用技巧及编程建议...

时间:2010-08-08  来源:supersugarcane

本文内容为我曾经在公司内部做的一个shell培训。并不针对基础用户,只是将我用到的觉得比较有用的经验进行分享。本文原来发表自百度空间,在CSDN申请了空间之后将其重新编辑在此。

一. 编码规范

1. 对命令返回值进行判断
2. 临时文件采用脚本名+PID标识,并清理
3. Function内的局部变量使用local限定符
4. 显式函数返回return,脚本退出exit
5. 变量名用${}括起来
6. 命令替换使用$()而不是``
7. 将变量写在脚本头或者独立成配置

二. 参数处理

1. 直接使用

$0,$1......,$@,$#
2. 通过eval赋值

function_test key1=value1 key2=value2
在function_test内部使用eval "$@"解析参数输入
后面就可以通过$key1,$key2使用了

3. 通过set改变环境变量
string="var1 var2 var3" set -- $string

则可以通过$1的值为var1,$#的值为3。这种方法改变了环境变量,慎重。或者在subshell中使用

4.getopts

三. 理解subshell/子进程

子进程可以继承父进程的环境变量
num=0 cat file | while read line ; do $num++ done echo $num

While read line ; do ... Done < file

"|"创建了一个子进程,无法将变量传给父shell

四. 文本使用here文档

/usr/sbin/sendmail -t <<-End_mail Subject:$mail_subject From:$mail_from To:$mail_to Return-Path:$mail_return_path Reply-to:$mail_reply_to `cat -` End_mail

利用"-"可以使用tab进行缩进,保持脚本可读

五. 避免常见陷阱

1. 避免shell参数个数限制

xargs command
2. 避免test测试错误

[ "X$var" = Xsomething ]
3. 避免变量未初始化错误

${var:-0}
4. 避免cd引起路径错误,通过subshell或者&&屏蔽
5. 更加安全的使用$@

${1+"$@"}
6. 避免进程异常退出

trap 'rm tempfle' EXIT
7. Crontab中的元字符%
8. 规避xargs的默认分割行为

find . Type f -mtime +7 -print 0 | xargs -0 rm
9. 避免拷贝错误

cp file dir/

一定记住最后的"/"

六. 理解文件描述符

>file 2>&1和2>&1 >file #区别为:shell从左到右读取参数 >file 2>&1 #将标准输出和标准错误重定向到file 2>&1 >file #将标准输出重定向到file,标准错误仍然为屏幕 &>/dev/null #等价于 >/dev/null 2>&1,使用前者。

七. 命令分组

1. subshell

(command1;command2) >log

2. 命令分组
{command1 ; command2 ;} >/dev/null  

3. 多个命令后台运行
((command1;command2)&

八. 字串替换

说明: #前%后,控制字串截取方式

实例:当前目录下有如下文件
host.new offline.new online.new rd.new wugui64.new xferlog.new
需要将后缀.new去掉
for x in `ls *new`; do old_name=${x%.new} mv $x $old_name done

九. 进程替换

<()
将进程的输出替换为文本做标准输入

同时从文件和标准输入获取:
cat file | diff - file2 #(-代表标准输入)
另外一种方式
diff <(cat file) file2

实例:diff两台服务器的同一个配置文件
Vimdiff <(ssh server1 cat conf) <(ssh server2 cat conf)

十. wget使用

1. 不要随便修改-t -T选项的设置
2. 限制使用"*",失败后返回值仍为0
3. 注意加-c 和不加-c的程序行为
4. 从线上下载数据要加--limit-rate=10M

十一. ssh的使用

非交互使用ssh,最好加-n参数

file文件的内容为:
server1 server2

以下脚本在运行时不会造成只显示一个server的命令输出

while read server ; do ssh -n $server ‘uname -r' done < file

远程使用vim,加-t参数,分配tty
超时,重试参数
-o ConnectTimeout=20 -o ConnectionAttempts=4
使用rsync前,加--dry-run参数
scp加-p参数,保持时间戳,利用浏览器缓存

十二. find的使用

1. 时间的使用

2. 排除目录
find abs -path "abs/zllib" -prune -o -name "*.sh" -print
3. 精确判断时间
touch -t time time_file Find -newer time_file
4. 运行命令
find -exec command {} \;
{}代表find找到的,作为command的参数

十三. 分离会话

1.nohup

nohup command &
需要注意的一点是如果command中包含多个命令,不要使用&&连接,需要使用;
2. Disown:命令敲下去发现忘记nohup了怎么办?使用disown补救

3. Screen:在wiki中搜一下

十四. 创建安全和可维护的脚本

1. 供其他进程使用的文件生成时

file </dev/null :>file md5sum file > file.md5

采用更名再mv的方式

md5sum file > file.new && mv file.new file
2. 将函数和配置独立成单独的脚本
3. 将不同服务器需要差异对待的变量提取成单独的配置文件
4. 日志打印必须包含脚本名(basename)、时间
5. 每步骤必须校验返回值
6. 脚本中避免使用*
7. 保持缩进4个空格
8. 过长的命令按照"|"折行
9. 创建目录使用mkdir -p
10. 如果采用后台运行一定要wait

( command1 ; command2 ) & wait
11. 对于需要获取命令输出的命令需要将stderr屏蔽到/dev/null
12. 抽离公共逻辑作为函数或者代码片段(导入变量)
13. 保证互斥和脚本实例唯一性

十五. 参考资料

1. Abs(advanced bash scripting guide)
2. 《unix power tools》unix超级工具上、下
3. 《server hacks》上、下
4. 《unix和linux自动化管理》

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载