1、脚本参数
<1.>什么是脚本参数?
我们在linux中运行脚本的时候可以在脚本名后面加上一些参数,这些参数叫做脚本的位置参数,也叫作程序参数,我们简单的将其认为是脚本运行时,传递给脚本程序的参数。
看个例子,我们写了一个脚本scp1.sh,我们在chmod u+x scp1(赋予uer执行脚本的权限之后),./scp1来运行脚本,这个时候如果这个脚本后面需要加一些参数,例如:./scp1 a b c ,这里的a b c就是传递的三个参数。
<2.>常用的一些参数有关符号?
$0:表示的是程序名字
$n n属于(1-9):表示的是第1-9个参数,
第9个之后的参数用${10}、${11}来表示
$*,$@:两个表示的都是所有的参数
$#:表示的是传递的参数的个数
$? 命令执行后返回的状态,返回状态为“是”,返回0,返回状态为“否”,返回1
$! 后台运行的最后一个进程号
$$ 当前进程号
一个例子看懂:
例:demo_arg程序如下
#! /bin/bash
echo “程序名: $0”
echo “命令传递参数个数:$#”
echo “参数值分别是:$1 $2 $3 $4 $5 $6 $7 $8 $9”
echo “所有参数: $@”
exit 0
[root@localhost root]# demo_arg a b c d e f g h i
程序名:demo_arg
命令传递参数个数: 9
参数值分别是: a b c d e f g h i
所有参数: a b c d e f g h i
<3.>shift命令
格式:shift [n]
之前我们介绍了可以使用${10}这样的格式来使用第10个及之后的参数,我们同样也可以通过shift命令来使用第九个之后的参数。
功能:把命令行参数向左移动N个位置
看一个例子:
例: demo_shift程序如下
#! /bin/bash
echo “程序名:$0”
echo “所有参数: $@”
echo “前三个参数:$1 $2 $3”
shift
echo “程序名:$0”
echo “所有参数: $@”
echo “前三个参数:$1 $2 $3”
shift 3
echo “程序名:$0”
echo “所有参数: $@”
echo “前三个参数:$1 $2 $3”
exit 0
[root@localhost root]# demo_shift 1 2 3 4 5 6 7 8 9 10 11 12
结果:
程序名: demo_shift
所有参数: 1 2 3 4 5 6 7 8 9 10 11 12
前三个参数:1 2 3
程序名: demo_shift
所有参数: 2 3 4 5 6 7 8 9 10 11 12
前三个参数: 2 3 4
程序名: demo_shift
所有参数: 5 6 7 8 9 10 11 12
前三个参数: 5 6 7
<4.>set命令
set 命令为 shell 设定参数变量。许多命令的输出是以空格分隔的值,如果要使用其中的某个数据域,使用 set 非常有效。
第一个例子:
#!/bin/sh
echo the date is $(date)
set $(date)
echo the month is $2
输出:
the date is Wed Apr 23 15:34:16 CST 2014
the month is Apr
将 date 命令的输出设置为参数表,再通过位置参数 $2 取得月份。
第二个例子:
#!/bin/bash
filename="$1"
echo "filename is $filename"
set $(ls -i $filename)
innode="$1"
echo "$innode"
执行:
./scp1 test
输出:
filename is test
1184758
2、if-then-elif-else-fi语句块
if expression1
then
then-commands
elif expression2
elif-commands
elif expression3
elif-commands
...
else
else-commands
fi
解释:elif相当于我们学过的else if,理论上可以有无限个elif。
fi是if语句结构的结束标志。
表达式:
表达式expression可以用test expression命令或[ expression ]来检测。这个命令检测一个表达式并返回true还是false。
命令语法:
test [expression]
[ expression ]
test命令可以使用的条件类型可以归为三类:字符串比较、算术比较和与文件有关的条件测试 。
<1.>字符串比较:
作用:测试字符串是否相等、长度是否为零,字符串是否为NULL。
常用的字符串操作符:
例:从键盘读入两个字符串,判断这两个字符串是否相等,如相等输出。
(1)用vi编辑程序
[root@localhost bin]#vi test4
#!/bin/bash
read ar1
read ar2
[ "$ar1" = "$ar2" ]
echo $? #保存前一个命令的返回码
(2)设置权限:
[root@localhost bin]#chmod +x test4
(3)执行:
[root@localhost root]# ./test4
aaa
bbb
1
注意: “[”后面和“]”前面及等号“=”的前后都应有一空格;
例: 比较字符串长度是否大于零。
(1)用vi编辑程序
[root@localhost bin]#vi test5
#!/bin/bash
read ar
[ -n "$ar" ]
echo $? #保存前一个命令的返回码,返回状态为“是”,返回0,返回状态为“否”,返回1
(2)设置权限:
[root@localhost bin]#chmod +x test5
(3)执行:
[root@localhost root]# ./test5
0
注意: 运行结果1表示ar的长度小于等于零,0表示ar的长度大于零。
<2.>算术比较:
例: 比较两个数字是否相等。
(1)用vi编辑程序
[root@localhost bin]#vi test6
#!/bin/bash
read x y
if test $x -eq $y
then
echo “$x= =$y”
else
echo “$x!=$y”
fi
(2)设置权限:
[root@localhost bin]#chmod +x test6
(3)执行:
[root@localhost bin]# ./test6
50 100
50!=100
[root@localhost bin]# ./test6
150 150
150= =150
<3.>逻辑操作:
例: 一个变量赋予一定的值,另一个为空,求两者的与、或。
(1)用vi编辑程序
[root@localhost bin]#vi test7
#!/bin/bash
part1 ="1111"
part2 ="" #part2为空
[ "$part1" -a "$part2" ]
echo $? #保存前一个命令的返回码
[ "$part1" -o "$part2" ]
echo $?
(2)设置权限:
[root@localhost bin]#chmod +x test7
(3)执行:
[root@localhost bin]# ./test7
1
0
<4.>文件条件测试
文件测试表达式通常是为了测试文件的信息,一般由脚本来决定文件是否应该备份、复制或删除。
常用操作符:
例:判断zb目录是否存在/root下。
(1)用vi编辑程序
[root@localhost bin]#vi test8
#!/bin/bash
[ -d /root/zb ]
echo $? #保存前一个命令的返回码
(2)设置权限:
[root@localhost bin]#chmod +x test8
(3)执行:
[root@localhost bint]# ./test8
1
(4) 在/root添加zb目录
[root@localhost bin]#mkdir zb
(5)执行:
[root@localhost bin]# ./test8
0
例:
例:输入一个字符串,如果是目录,则显示目录下的信息,如为文件显示文件的内容。
[root@localhost bin]#vi test9
#!/bin/bash
echo “Please enter the directory name or file name”
read DORF
if [ -d $DORF ]
then
ls $DORF
elif [ -f $DORF]
then
cat $DORF
else
echo “input error!”
fi
3、for语句
语法:
for 变量 in 列表
do
操作
done
在列表中的词被逐一赋值给变量,然后就执行操作中的命令,这通常被称为循环体。
列表中的词有多少个,在循环体中的命令就可以执行相应的次数
例: 在列表中的值:a,b,c,e,i,2,4,6,8用循环的方式把字符与数字分成两行输出。
(1)用gedit编辑脚本程序test4
[root@localhost root]# gedit test9
#!/bin/bash
for i in a,b,c,e,i 2,4,6,8
do
echo $i
done
(2)设置权限:
[root@localhost bin]#chmod +x test9
(3)执行:
[root@localhost bin]# ./test9
a,b,c,e,i
2,4,6,8
注意:在循环列表中的空格可表示换行
例:求从1到100的和。
(1)用gedit编辑脚本程序test11
[root@localhost bin]# gedit test11
#!/bin/sh
total=0
for ((j=1;j<=100;j++)) #双括号不能省略,双括号的作用是:里面的语句可以像c语言一样执行
do
total=`expr $total + $j`
#!反引号的作用是用来将表达式转为一个值,expr用来将+号转为真正的加法运算,注意+左右要有空格!
done
echo "The result is $total"
(2)设置权限:
[root@localhost bin]#chmod +x test11
(3)执行:
[root@localhost bin]# ./test11
The result is 5050
4、while语句
格式:
while 表达式
do
操作
done
例:用while循环求1到100的和。
(1)用gedit编辑脚本程序test12
[root@localhost bin]#gedit test12
total=0
num=0
while((num<=100));
do
total=`expr $total + $num`
((num+=1))
done
echo "The result is $total"
(2)设置权限:
[root@localhost bin]#chmod +x test12
(3)执行:
[root@localhost bin]# ./test12
The result is 5050
5、until语句
格式:
until 表达式
do
操作
done
例:用until循环求1到100的和。
(1)用gedit编辑脚本程序test13
[root@localhost bin]#gedit test13
total=0
num=0
until [ $num -gt 100 ]
do
total=`expr $total + $num`
num=`expr $num + 1`
done
echo "The result is $total"
(2)设置权限:
[root@localhost bin]#chmod +x test13
(3)执行:
[root@localhost bin]#./test13
The result is 5050
6、case语句
格式:
case 字符串 in
值1|值2) 操作
;;
值3|值4) 操作
;;
…
值5|值6) 操作
;;
esac
例:Linux是一个多用户操作系统,编写一程序根据不同的用户登录输出不同的反馈结果。
用vi编辑脚本程序test15
[root@localhost bin]#vi test15
#!/bin/bash
case $USER in
beichen)
echo "You are beichen!";;
liangnian)
echo "You are liangnian"; //注意这里只有一个分号
echo "Welcome!";; //这里才是两个分号
root)
echo "You are root! "; echo "Welcome!";;
//将两命令写在一行,用一个分号作为分隔符
*)
echo "Who are you?$USER?";;
esac
7、break和continue语句
break命令使得程序跳出for、while、until循环,执行done后面的语句,这样就永久终止了循环。
continue命令使得程序跳到done,这使得循环条件被再次求值,从而开始新的一次循环,循环变量取循环列表中的下一个值。。
无论哪种情况,循环体中在这两条命令后的语句都没有执行。
break命令和continue命令常作为条件语句的一部分来使用。
8、exit语句
exit命令使脚本程序结束运行,退出码为n。
语句语法:exit n
在任何一个交互式shell的命令提示符中使用这个命令,它都会让你退出系统。
如果在退出时不指定一个退出状态,那么该脚本中最后一条被执行命令的状态将被用作返回值。
在shell脚本编程中,退出码0表示成功,退出码1~125是脚本程序使用的错误代码。其余数字具有保留含义