初学shell脚本

来源:互联网 发布:数据录入员工资 编辑:程序博客网 时间:2024/05/20 05:47

这两天初次接触shell编程,所谓shell编程其实就是用一定的语法将各种基本的命令组合起来,让shell程序去解释执行。如果对windows的dos有了解,可以这样理解,其实shell脚本文件和.bat批处理文件差不多,不过linux下的shell比起windows的dos强大很多。

shell有很多种,如bash、sh 、tcsh、 ksh等,linux系统里面默认使用的是bash。

下面看一下学习shell的第一个程序:

输入命令vi my_01.sh,创建一个my_01.sh文件并用vi编辑器打开。编辑内容如下:

1 #!/bin/bash2 echo "aaaa"3 echo "第一次接触shell"

这里第一行是指让bash这个shell去执行这个shell程序。echo是用来输出的,第二行和第三行分别输出两句话。

执行这个shell程序可以用如下几种方法:

1  ./my_01.sh

2  . my_01.sh

3  bash my_01.sh

下面是第二个shell程序:

1 #!/bin/bash2 #my_02.sh3 read -p "please input your name:" name4 echo "$name,welcome!"

这里第三行read命令是指等待用户输入,-p后面是指提示,它还有一个参数-t是设置等待时间的。这个程序运行结果如下:

[liuling@bogon test]$ ./my_02.sh
please input your name:liuling
liuling,welcome!

注:第四行echo使用的是双引号,如果使用单引号的话,则这句就会直接输出 $name,welcome! 。双引号是可以解析里面的变量的,而单引号则不行。

下面看看shell脚本的语法:

一、条件判断if else的使用

if分支语句的写法:

if 条件测试    then 满足条件执行什么    else 不满足条件执行什么fi

多分支写法:

if 条件1    then     执行命令2elif 条件1    then     执行命令2else    执行命令3fi

注:if和fi要配对,以fi结束这个条件判断。在不满足第一个条件下再判断使用的是elif,而不是else if。then必须独占一行。

 下面看几个例子:

 1 #!/bin/bash 2 #my_03.sh 3  4 read -p "pelease input your name:" name 5 read -p "pleaase input your password:" passwd 6 #if test $name = "liuling"  7 if [ $name = "liuling" -a $passwd = "lz19921009" ] 8 then 9     echo "登录成功!"10 else11     echo "登录失败!"12 fi
 1 #!/bin/bash 2 #my_04.sh 3  4 read -p "please input your score:" score 5  6 if [ $score -gt 90 ] 7 then 8     echo "优秀!" 9 elif [ $score -gt 80 -a $score -le 90 ]10 then11     echo "良好!"12 else13     echo "一般!"14 fi
 1 #!/bin/bash 2 #my_05.sh 3  4 read -p "please input your score:" score 5 #如果使用(())的话,只能用< > >= <= 6 if (( $score > 90 )) 7 then 8     echo "优秀!" 9 elif [[ $score -gt 80 && $score -le 90 ]]10 then11     echo "良好!"12 else13     echo "一般!"14 fi

测试用户输入的文件名是目录还是文件:

 1 #!/bin/bash 2 #my_06.sh 3  4 read -p "请输入一个目录或者文件名:" name 5 if [ -z $name ] 6 then 7     echo "你输入的信息为空!" 8 else 9     if [ -f $name ]10     then11         echo "这是一个文件!"12     elif [ -d $name ]13     then14         echo "这是一个目录!"15     else16         echo "不存在这样一个目录或者文件!"17     fi18 fi

 

这三个例子都是关于if条件判断的用法。条件有这么几种写法:[ 条件 ]、test 条件、[[ 条件 ]]、(( 条件 )),用的最多的是第一种。常用判断符号如下

①、逻辑运算符

-a expr1 -a expr2 逻辑与

-o expr1 -o expr2 逻辑或

! !expr1 逻辑非

②、数值判断

-eq num1 -eq num2 是否相等

-ne num1 -ne num2 是否不相等

-gt num1 -gt num2 是否大于

-ge num1 -ge num2 是否大于等于

-lt num1 -lt num2 是否小于

-le num1 -le num2 是否小于等于

③、字符串判断

= str1 = str2 字符串是否相等

!= str1 != str2 字符串是否不等

-n -n str1 字符串长度是否不等于0

-z -z str2 字符串长度是否等于0

④、文件判断

-r -r filename 文件是否存在且可读

-w -w filename 文件是否存在且可写

-s -s filename 文件是否存在且长度非0

-f -f filename 文件是否存在且是普通文件

-d -d filename 文件是否存在且是一个目录

 

在使用条件判断的时候一定要注意空格,如if [ $name = "liuling" -a $passwd = "lz19921009" ],[]里面前后要有一个空格,所有的判断符号以及逻辑运算符号前后都要有空格,否则会报错。使用[[ 条件 ]]的时候只能使用"&&"符号作为逻辑与来代替"-a",如果使用(( 条件 ))的话,只能用< > >= <=符号,而不能使用“-eq”等符号。

二、case的用法

这里的case优点类似于java中的swith case

case语法如下:

case var inpattern 1)    执行语句1    ;;pattern 2)    执行语句2    ;;pattern 3)    执行语句3    ;;*)    执行语句4    ;;esac

注意:*)指匹配其他任意字符串
         每种情况都以;;结束

下面是几个case用法的例子

1.模拟菜单的选择

 1 #!/bin/bash 2 #my_07.sh 3  4 echo "1 - 普通显示" 5 echo "2 - 详细显示" 6 echo "3 - 显示隐藏文件" 7 echo "4 - 推出" 8  9 read -p "请选择操作号:" num10 case $num in11     1) 12         ls ;;13     2)14         ls -l ;;15     3)16         ls -al ;;17     4)18         exit ;;19     *)20         echo "请输入正确的操作(1--4)" 21         exit ;;22 esac

 

三、循环语句的使用

1、for循环

for 变量名 in 取值列表do    命令序列done


下面是for循环使用的小例子:

 1 #!/bin/bash 2 #my_08.sh 3  4 for a in `seq 1 3 10` 5 do 6     echo $a 7 done 8 echo "-------------------" 9 for ((i=1;i<=10;i++))10 do11     echo $i12 done

这里第四行使用了`seq 1 3 10`,``是反引号,也就是键盘上Esc下面的一个键,``里面可以写执行命令,把执行后的结果返回。

seq命令是指序列,seq start size max,start是起始,size是步长,max就是限制的数,比如seq 1 3 10,则返回的是1 4 7 10。

第9行代码也有点特别,有点像java里面的for循环,不过是双重小括号,在shell中这样也是可以的。

下面是一个统计文件数目的小程序:

 1 #!/bin/bash 2 #my_09.sh 3  4 i=0 5 for name1 in `ls /etc` 6 do 7    # i=`expr $i + 1` 8    # let i++ 9    # i=$[$i + 1]10    # i=$(($i + 1))11    ((i++))12 13 done14 echo "文件总数为:$i"

注:7、8、9、10、11行是数字自增的不同写法,都可以。

2、while循环

while 条件do    命令序列done

下面是一个录入客户资料的shell脚本:

 1 #!/bin/bash 2 #my_10.sh 3  4 while true 5 do 6         echo "登记客户资料(c继续,q退出):" 7         read choice 8  9         case $choice in10                 c)11                         echo "请输入客户名字:"12                         read name113                         echo "请输入客户年龄:"14                         read age115                         echo "姓名:"${name1}" - 年龄:"${age1} >>customer.txt16                         ;;17                 q)18                         exit19                         ;;20         esac21 done

注:
>>是指重定向,将标准输出重定向到其他的输出流中,如上面15行是指将标准输出重定向到customer.txt文件。所以echo输出的内容会输出到customer.txt文件中去。

>> 和 > 区别

>>customer.txt 追加保存到customer.txt文件中, 如果文件不存在会自动创建。

>customer.txt 就会重新写入, 覆盖原有的数据

 

四、函数的应用

function 函数名(){}or函数名(){}函数调用:函数名函数名 参数1 参数2

下面是一个小例子程序:

1 #!/bin/bash2 #fun.sh3 function add(){4     echo $(($1+$2))5 }6 add 20 307 add 20 90

 


原创粉丝点击