程序员人生 网站导航

Java之美[从菜鸟到高手演练]之Linux下shell脚本的使用(一)

栏目:服务器时间:2015-01-30 08:08:41
作者:2青

个人站点:zhangerqing.cn    邮箱:xtfggef@gmail.com    微博:http://weibo.com/xtfggef


Shell脚本就是将很多条命令结合起来写在1起,通过运算和判断来实现很多功能的文本。为何学习shell,首先1些常规的系统管理操作,并且需要自动化地履行,如果用shell脚本把这些操作集中在1起,只需要定期的履行这个shell脚本就能够了,其次,对1些复杂的文本处理,比如日志分析等等,可能需求比较多,单条履行命令不是很方便,因此也需要使用shell实现,所以,如果想学通linux系统,shell是必备的1课。本章我们主要以bash shell为主,不触及其它shell。


HelloWorld

第1个shell脚本,输出Hello World。



第1行必须是#!/bin/bash(声明我们用的是bash shell,否则系统不知道需要调用那个shell去履行脚本)。由#开始的表示注释,后面的字符在履行的时候全部被疏忽。主体就是第4行的echo -e “Hello World a ”,-e表示启用反斜线转义, a表示输出“咚”的声音, 表示换行。写完脚本后,为脚本添加可履行权限:chmod +x sh01.sh,然后用./sh01.sh履行就行了。



交互式脚本

最简单的情况就是获得用户输入,然后输出。



这个例子也比较简单,实用read进行输入的获得,并将值赋于紧随着的变量上,履行效果:



数值计算

bash shell仅支持整数的简单加减乘除,需要用到$((express)),两层小括号内的express则为计算的表达式。



第7行采取declare的方式声明1个变量sum,使用$(( ))的方式计算结果。



判断式

1. test命令

检查文件是不是存在:test -e filename && echo "Exist" || "Not exist",如果存在,会输出Exist,否则Not exist. test命令有很多参数.

命令参数解释备注
关于文件类型的判断, test -e filename
test-e文件名是不是存在经常使用
 -f文件名是不是存在且为文件经常使用
 -d目录名是不是存在且为目录经常使用
 -b文件名是不是存在且为1个block device装备 
 -c文件名是不是存在且为1个character device装备 
 -S文件名是不是存在且为1个Socket装备 
 -p文件名是不是存在且为1个FIFO文件 
 -L文件名是不是存在且为1个连接文件 
关于文件的权限检测,如test -r filename
 -r文件名是不是存在且具有可读权限 
 -w文件名是不是存在且具有可写权限 
 -x文件名是不是存在且具有可履行权限 
 -u文件名是不是存在且具有SUID属性 
 -g文件名是不是存在且具有SGID属性 
 -k文件名是不是存在且具有Sticky bit属性 
 -s文件名是不是存在且为非空白文件 
关于两个文件之间的比较,test file1 -nt file2
 -ntnewer than,判断file1是不是比file2经常使用
 -otolder than,判断file1是不是比file2 
 -ef判断file1file2是不是为同1文件 
关于两个整数之间的比较,test n1 -eq n2
 -eq两数值相等 
 -ne两数值不等 
 -gtgreater thann1 大于n2 
 -ltless thann1小于n2 
 -gegreater than or equaln1 大于等于n2 
 -leless than or equaln1小于等于n2 
判断字符串
 test -z string判断字符串是不是为0 
 test -n string判断字符串是不是不为0 
 test str1 = str2判断字符串是不是相等 
 test str1 != str2判断字符串是不是不等 
多重条件判定,test -r filename -a -x filename
 -a两个条件同时成立时返回true 
 -O任何1个条件成立时返回true 
 !反向状态,当条件不成立时返回true 

2. []判断符

除使用test外,我们还可使用[](中括号)来进行1些判断,如判断HOME环境变量是不是为空:

[ -z $HOME ] ; echo $?

注意命令中的空格,[以后]之前都要跟1个空格,如果用到==,则==两侧也都需要有1个空格(要末都有,要末都没有)。比如,[ "aaa" == "bbb" ],这是公道的方式,如果写成[ "aaa" =="bbb" ]或[ "aaa"== "bbb" ]就不公道了,会报错。使用[]进行判断时,应当注意以下几点:

a. 在括号[]内的组件都需要空格来分隔。

b. 括号内的变量最好要用双引号括起来。

c. 括号内的常量最好也要用单引号或双引号括起来。


3. shell script的默许变量$0, $1, $2...

当我们给1个脚本带参数运行时,我们可以在脚本里获得到该命令的1些信息,比如:sh01.sh aaa bbb,在脚本里,$0就能够拿到脚本名,$1,$2分别为第1、第2个参数,以此类推,我们可以总结1下:

$0, 脚本名

$1, $2,脚本的参数

$#, 参数个数

$@, 所有参数,每一个参数用双引号括起来

$*, 所有参数,用空格隔开

做个例子:



运行结果:



条件判断式

这个好理解,就是我们常见的if else语句,在shell脚本里用if then表示if语句,if then else表示if else语句,if出现时要用fi来结尾,else if用elif代替。看个例子:

1. 判断输入的第1个参数是否是hello

2. 如果无任何参数,则提示用户输入1个参数

3. 如果输入的参数不是hello,则提示用户只能输入hello作为参数



查看效果:



case判断

我们用进程序语言里的switch case语句,在某些情况下比if else方便很多,在shell脚本里也有类似的语句块叫:case in esac,还是上面的例子,我们换种写法:



看看效果:



循环

1. while do ... done

这个就是我们常见的while循环,当满足条件时,已知履行循环体里的语句,直到条件不满足时推出循环,done为循环结束标志。





2. until do ... done

该语句和while do ... done正好相反,当条件不满足时进行循环,满足时结束循环。


3. for do ... done

常见的for循环,1般就是对1个已知的数组或结构进行循环遍历。



for do ... done还有1种用法就是对数值的处理,可使用我们传统for循环的方式: for (( ;;))





shell 脚本的追踪与调试

在履行1个shell脚本之前,我们可以先进行1系列的语法检查,这样可以初步检测出1些明显的问题。

sh [-nvx] script.sh

-n, 不履行script,仅检查语法问题

-v, 在履行script前,先输出脚本到屏幕上

-x, 将使用到的script显示到屏幕上,列出所有的履行进程


这1章基本就要结束了,主要是1些基本的编写shell script的语法,我们可以先把这些掌握熟了,多加练习,然后多看1些复杂的文本处理的例子,多学习,多模仿复杂脚本的写法,然后写出复杂的脚本就不再是甚么难事。

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐