shell语法使用

  这两天初次接触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/bash
2 echo aaaa
3 echo 第一次接触shell

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

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

  1  ./my_01.sh

  2  . my_01.sh

  3  bash my_01.sh

注:新创建的文件默认是没有执行权限的,所以必须给该文件授予执行权限后才能执行。授权命令:chmod u+x my_01.sh或者chmod 755 my_01.sh

  下面是第二个shell程序:


1 #!/bin/bash
2 #my_02.sh
3 read -p please input your name: name
4 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
执行命令2
elif 条件1
then
执行命令2
else
执行命令3
fi

   注: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 else
11 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 then
11 echo 良好!
12 else
13 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 then
11 echo 良好!
12 else
13 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 then
11 echo 这是一个文件!
12 elif [ -d $name ]
13 then
14 echo 这是一个目录!
15 else
16 echo 不存在这样一个目录或者文件!
17 fi
18 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 in
pattern
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 请选择操作号: num
10 case $num in
11 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 <span style="color: #0000ff;">seq</span> <span style="color: #800080;">1</span> <span style="color: #800080;">3</span> <span style="color: #800080;">10</span><span style="color: #000000;">
5 do
6 echo $a
7 done
8 echo ——————-
9 for ((i=1;i<=10;i++))
10 do
11 echo $i
12 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 <span style="color: #0000ff;">ls</span> /<span style="color: #000000;">etc
6 do
7 # i=<span style="color: #0000ff;">expr</span> $i + <span style="color: #800080;">1</span><span style="color: #000000;">
8 # let i++
9 # i=$[$i + 1]
10 # i=$(($i + 1))
11 ((i++))
12
13 done
14 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 in
10 c)
11 echo 请输入客户名字:
12 read name1
13 echo 请输入客户年龄:
14 read age1
15 echo 姓名:${name1} - 年龄:${age1} >>customer.txt
16 ;;
17 q)
18 exit
19 ;;
20 esac
21 done

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

>> 和 > 区别

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

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

 

四、函数的应用


function 函数名(){

}
or
函数名(){

}

函数调用:
函数名
函数名 参数1 参数2

下面是一个小例子程序:


1 #!/bin/bash
2 #fun.sh
3 function add(){
4 echo $(($1+$2))
5 }
6 add 20 30
7 add 20 90