shell语法应用:shell条件判断与for、while循环句等

发布时间:2019-10-16编辑:脚本学堂
shell语法的基础内容,包括shell程序的定义、shell条件判断语句、shell for循环语句、shell while循环语句的用法,以及shell函数的定义与使用,非常实用的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编辑器打开。

shell脚本:
 

#!/bin/bash
echo "aaaa"
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程序:
 

#!/bin/bash
#my_02.sh
read -p "please input your name:" name
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必须独占一行。

例3:
 

复制代码 代码示例:
#!/bin/bash
#my_03.sh
read -p "pelease input your name:" name
read -p "pleaase input your password:" passwd
#if test $name = "liuling"
if [ $name = "liuling" -a $passwd = "lz19921009" ]
then
echo "登录成功!"
else
echo "登录失败!"
fi

例4:
 

复制代码 代码示例:
#!/bin/bash
#my_04.sh
read -p "please input your score:" score
if [ $score -gt 90 ]
then
echo "优秀!"
elif [ $score -gt 80 -a $score -le 90 ]
then
echo "良好!"
else
echo "一般!"
fi

例5:
 

复制代码 代码示例:
#!/bin/bash
#my_05.sh
read -p "please input your score:" score
#如果使用(())的话,只能用< > >= <=
if (( $score > 90 ))
then
echo "优秀!"
elif [[ $score -gt 80 && $score -le 90 ]]
then
echo "良好!"
else
echo "一般!"
fi

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

复制代码 代码示例:
#!/bin/bash
#my_06.sh
read -p "请输入一个目录或者文件名:" name
if [ -z $name ]
then
echo "你输入的信息为空!"
else
if [ -f $name ]
then
echo "这是一个文件!"
elif [ -d $name ]
then
echo "这是一个目录!"
else
echo "不存在这样一个目录或者文件!"
fi
fi

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

-aexpr1 -a expr2逻辑与
-oexpr1 -o expr2逻辑或
!!expr1逻辑非

②、数值判断
 

-eqnum1 -eq num2是否相等
-nenum1 -ne num2是否不相等
-gtnum1 -gt num2是否大于
-genum1 -ge num2是否大于等于
-ltnum1 -lt num2是否小于
-lenum1 -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.模拟菜单的选择
 

复制代码 代码示例:
#!/bin/bash
#my_07.sh
echo "1 - 普通显示"
echo "2 - 详细显示"
echo "3 - 显示隐藏文件"
echo "4 - 推出"
read -p "请选择操作号:" num
case $num in
1)
ls ;;
2)
ls -l ;;
3)
ls -al ;;
4)
exit ;;
*)
echo "请输入正确的操作(1--4)"
exit ;;
esac

三、shell循环语句的使用
1、for循环
for 变量名 in 取值列表
do
命令序列
done

for循环使用的小例子:
 

复制代码 代码示例:
#!/bin/bash
#my_08.sh
for a in `seq 1 3 10`
do
echo $a
done
echo "-------------------"
for ((i=1;i<=10;i++))
do
echo $i
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中这样也是可以的。

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

复制代码 代码示例:
#!/bin/bash
#my_09.sh
i=0
for name1 in `ls /etc`
do
# i=`expr $i + 1`
# let i++
# i=$[$i + 1]
# i=$(($i + 1))
((i++))
done
echo "文件总数为:$i"
 

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

2、shell while循环语句
while 条件
do
命令序列
done

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

复制代码 代码示例:
#!/bin/bash
#my_10.sh
while true
do
echo "登记客户资料(c继续,q退出):"
read choice
case $choice in
c)
echo "请输入客户名字:"
read name1
echo "请输入客户年龄:"
read age1
echo "姓名:"${name1}" - 年龄:"${age1} >>customer.txt
;;
q)
exit
;;
esac
done
 

注:
>>是指重定向,将标准输出重定向到其他的输出流中,如上面15行是指将标准输出重定向到customer.txt文件。所以echo输出的内容会输出到customer.txt文件中去。
>> 和 > 区别
>>customer.txt 追加保存到customer.txt文件中, 如果文件不存在会自动创建。
>customer.txt 就会重新写入, 覆盖原有的数据

四、shell函数的应用
function 函数名(){
}
or
函数名(){
}
函数调用:
函数名
函数名 参数1 参数2

例子:
 

复制代码 代码示例:
#!/bin/bash
#fun.sh
function add(){
echo $(($1+$2))
}
add 20 30
add 20 90