shell脚本入门篇
简介
通常情况下,我们从命令行输入一个命令就能得到系统的响应。但是,当我们要一个接一个的输入命令而只是希望得到最后的结果时,这样做就显得没有效率了。要达到这样的目的,我们利用shell脚本来实现。
shell参数
位置参数
由系统提供的参数称为位置参数。位置参数的值可以用$N得到,N是一个数字,即,如果N=1,那么位置参数为$1,和c语言中的数组比较类似。Linux中,会把输入的命令字符串进行分段并进行编号,从0开始。第0号表示为程序名字,从1开始就是表示传递给程序的参数。例如:$0表示程序的名字,$1表示传递给程序的第一个参数,依次类推。
内置参数
在上一节中说到$0,是一个内置参数,是必须的,而像$1则是可有可无的。和$0一样的内部变量还有一下几个:
$#:传递给程序的参数数量
$?:上一个代码或者shell程序在shell中退出的返回值,如果正常退出则返回0,反之返回非0数。
$*:传递给程序的所有参数组成的字符串。
利用内置参数别写删除一个文件的脚本。
例:
点击(此处)折叠或打开
#name :del
#this program to compress a file to thedustbin
if test $# -eq 0
then
echo “please specify a file”
else
gzip $1
mv $1.gz $HOME/dustbin
echo “file $1 is deleted!”
fi
首先在目录下面创建一个空白文件,用于测试。
touch 1
执行脚本程序:sh del.sh 1
程序执行完后,提示文件已经删除。然后再ls一把,查看1文件是否还存在。
变量表达式
上面的程序中,用到了一个关键字test,他是shell程序中的一个表达式比较。通过和shell提供的if等条件语句相结合可以方便的判断。
其用法如下:
test 表达式
表达式所代表的操作符有字符串操作符、数字操作符、逻辑操作符以及文件操作符。
字符串比较
作用:测试字符串是否相等、长度是否为0,字符串是否为NULL(注:bash区分零长度字符串和空字符串)
字符串操作符:
=:比较两个字符串是否相同,相同则为“是”;
!=:比较两个字符串是否相同,不同则为“是”;
-n:比较字符串长度是否大于0,如果大于0则为“是”;
-z:比较字符串长度是否等于0,如果等于则为“是”;
数字比较符:
-eq:相等
-ge:大于等于
-le:小于等于
-ne:不等于
-gt:大于
-lt:小于
逻辑操作:
!:取反,与一个逻辑值相反的逻辑值。
-a:与(and),两个逻辑值为“是”,返回值为“是”,反之为“否”
-o:或(or),两个逻辑值有一个为“是”,返回值就为“是”
文件操作:
文件测试表达式通常是为了测试文件信息,一般由脚本来决定文件爱你是否应用备份、复制和删除。常用的文件操作符有:
-d:对象存在而且是目录返回“是”
-f:对象存在而且是文件返回“是”
-L:对象存在而且为符号连接返回“是”
-r:对象存在而且可读则返回“是”
-s:对象存在而且长度非零则返回“是”
-w:对象存在而且可写则返回值为“是”
-x:对象存在而且可执行则返回“是”
循环结构语句
shell中常见的循环语句有for循环、while循环、until循环。
for循环
语法:for 变量 in 列表
do
操作
done
变量是要在循环列表内部用来指代当前所指代的别表中的那个对象的。
列表是在for循环的内部要操作的对象,可以是字符串也可以是文件,如果是文件,那么列表就是文件名了。
例:删除垃圾信箱中的.gz文件
点击(此处)折叠或打开
# delete all file with extension of “gz” in the dustbin
for I in $HOME/dustbin/*.gz
do
rm ?CF $i
echo “$i has been deleted”
done
while循环
语法:while表达式
do
操作
done
只要while表达式成立,do和done之间的操作就会一直在进行
until循环
语法:until 表达式
do
操作
done
重复do到done之间的操作直到表达式成立。
点击(此处)折叠或打开
#test until
#add from 1 to 100
total=0
num=0
until test num –eq 100
do
total=`expr $total + $num`
num=`expr $num + 1`
done
echo “the result is $total”
条件语句
shell中的条件语句主要有if语句、case语句
if语句
语法:if 表达式1 then
操作
elif 表达式1 then
操作
elif 表达式3 then
操作
……..
else
操作
fi
在shell里的if结束标志是将if反过来写成fi;而elif其实就是else if的缩写。
case语句
语法:case 字符串 in
值1|值3)
操作;;
值2|值4)
操作;;
……
*)
操作;;
ease
case的作用就是当字符串与某个值相同就执行那个值后面的操作。如果同一个操作对应多个值,则使用“|”将各个值分开。
例:
点击(此处)折叠或打开
case $USER in
csj)
echo “you are csj”;;
root)
echo “you are root”;
echo “welcome!”;;
*)
echo “who are you? $USER”;;
esac
运行这个脚本,程序根据你的登录用户名,打印相关的信息。
补充:1、程序必须是以#!/bin/sh开始,是用来告诉系统后面的参数是用来执行该文的程序。
2、命令
read var:提示用户输入,并将输入值赋给变量。
sort file:对文件中的行进行排序。
expr:进行数学运算。
tee:将数据输出到标准输出设备和文件。
dirname file:返回文件所在的路径。
head file:打印文件的开头几行,默认是10行,通过-n指定行数。
tail file:打印文本文件末尾几行,默认是10行,通过-n指定行数。
管道:将一个命令的结果做另一个命令的输入。
grep “hello” file | wc –l
重定向:将命令的结果输出到文件,而不是标准输出。
>:写入文件并覆盖旧文件的内容
>>:加到文件的末尾,保留旧文件内容。