Shell编程学习(3)----脚本参数和控制语句的总结

来源:互联网 发布:新网域名管理地址 编辑:程序博客网 时间:2024/06/05 11:47

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/bashecho “程序名: $0echo “命令传递参数个数:$#echo “参数值分别是:$1 $2 $3 $4 $5 $6 $7 $8 $9echo “所有参数: $@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/bashecho “程序名:$0echo “所有参数: $@echo “前三个参数:$1 $2 $3”shiftecho “程序名:$0echo “所有参数: $@echo “前三个参数:$1 $2 $3”shift 3echo “程序名:$0echo “所有参数: $@echo “前三个参数:$1 $2 $3exit 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/shecho the date is $(date)set $(date)echo the month is $2输出:the date is Wed Apr 23 15:34:16 CST 2014the month is Apr将 date 命令的输出设置为参数表,再通过位置参数 $2 取得月份。
第二个例子:#!/bin/bashfilename="$1"echo "filename is $filename"set $(ls -i $filename)innode="$1"echo "$innode"执行:./scp1 test输出:filename is test1184758

2、if-then-elif-else-fi语句块

if expression1    then         then-commands    elif expression2        elif-commands    elif expression3        elif-commands    ...    else        else-commandsfi解释:elif相当于我们学过的else if,理论上可以有无限个eliffiif语句结构的结束标志。    

表达式:

表达式expression可以用test expression命令或[ expression ]来检测。这个命令检测一个表达式并返回true还是false。

命令语法:
test [expression]
[ expression ]

test命令可以使用的条件类型可以归为三类:字符串比较、算术比较和与文件有关的条件测试 。

<1.>字符串比较:
作用:测试字符串是否相等、长度是否为零,字符串是否为NULL。

常用的字符串操作符:

例:从键盘读入两个字符串,判断这两个字符串是否相等,如相等输出。(1)用vi编辑程序[root@localhost bin]#vi test4#!/bin/bashread  ar1 read  ar2 [ "$ar1"  =  "$ar2" ]echo $?   #保存前一个命令的返回码(2)设置权限:    [root@localhost bin]#chmod +x test4(3)执行:[root@localhost root]# ./test4 aaabbb1注意: “[”后面和“]”前面及等号“=”的前后都应有一空格;例: 比较字符串长度是否大于零。(1)用vi编辑程序[root@localhost bin]#vi test5#!/bin/bashread  ar [  -n  "$ar"  ]echo $?   #保存前一个命令的返回码,返回状态为“是”,返回0,返回状态为“否”,返回1(2)设置权限:[root@localhost bin]#chmod +x test5(3)执行:[root@localhost root]# ./test50注意: 运行结果1表示ar的长度小于等于零,0表示ar的长度大于零。

<2.>算术比较:

例: 比较两个数字是否相等。(1)用vi编辑程序[root@localhost bin]#vi test6#!/bin/bashread x yif  test  $x  -eq  $y   then       echo$x= =$yelse      echo$x!=$yfi(2)设置权限:[root@localhost bin]#chmod +x test6(3)执行:[root@localhost bin]# ./test650  10050!=100[root@localhost bin]# ./test6150  150150= =150

<3.>逻辑操作:

例: 一个变量赋予一定的值,另一个为空,求两者的与、或。(1)用vi编辑程序[root@localhost bin]#vi test7#!/bin/bashpart1 ="1111"part2 =""    #part2为空 [ "$part1"  -a  "$part2" ]echo $?   #保存前一个命令的返回码 [ "$part1"  -o  "$part2" ]echo $?  (2)设置权限:[root@localhost bin]#chmod +x test7(3)执行:[root@localhost bin]# ./test710

<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]# ./test81(4) 在/root添加zb目录[root@localhost bin]#mkdir zb(5)执行:[root@localhost bin]# ./test80例:例:输入一个字符串,如果是目录,则显示目录下的信息,如为文件显示文件的内容。[root@localhost bin]#vi test9#!/bin/bashecho “Please enter the directory name or file name”read  DORFif [ -d $DORF ]then  ls $DORF elif [ -f $DORF]thencat $DORFelse  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/bashfor 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]# ./test9a,b,c,e,i2,4,6,8注意:在循环列表中的空格可表示换行例:求从1100的和。(1)用gedit编辑脚本程序test11[root@localhost bin]# gedit test11#!/bin/shtotal=0for ((j=1;j<=100;j++))  #双括号不能省略,双括号的作用是:里面的语句可以像c语言一样执行  do     total=`expr $total + $j`#!反引号的作用是用来将表达式转为一个值,expr用来将+号转为真正的加法运算,注意+左右要有空格!  doneecho "The result is $total"(2)设置权限:[root@localhost bin]#chmod +x test11(3)执行:[root@localhost bin]# ./test11The result is 5050

4、while语句

格式:

while 表达式  do    操作  done
例:用while循环求1100的和。  (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]# ./test12The result is 5050

5、until语句

格式:

until 表达式do操作done
例:用until循环求1100的和。(1)用gedit编辑脚本程序test13[root@localhost bin]#gedit test13total=0num=0until [ $num -gt 100 ]do total=`expr $total + $num`   num=`expr $num + 1`doneecho "The result is $total"(2)设置权限:    [root@localhost bin]#chmod +x test13(3)执行:[root@localhost bin]#./test13The result is 5050

6、case语句

格式:

case 字符串 in1|值2)  操作    ;;值3|值4)  操作    ;;…值5|值6)   操作   ;;esac
例:Linux是一个多用户操作系统,编写一程序根据不同的用户登录输出不同的反馈结果。 用vi编辑脚本程序test15[root@localhost bin]#vi test15#!/bin/bashcase $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是脚本程序使用的错误代码。其余数字具有保留含义

阅读全文
0 0