Linux认证 > 综合辅导 > 文章内容

linux从入门到精通(38)

2016-6-27编辑:ljnbset

编写Shell脚本的简单语法

  提到编程,条件、分支、循环等语法肯定少不了。shell脚本编程亦是如此,下面只是结合最近学习的一些简单语法做的笔记,如有错误,欢迎指正。

  if条件语句

  条件测试操作

    test命令:

      用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其它值

      格式:test  条件表达式   或者

         [  条件表达式  ](注意:方括号[]和条件表达式语句之间至少需要一个空格)

  常见的测试类型:测试文件状态;字符串比较;整数值比较;逻辑测试

测试文件状态:[  操作符   文件或目录  ]

常用的测试操作符

-d:测试是否为目录(Directory)

-e:测试目录或文件是否存在(Exist)

-f:测试是否为文件(File)

-r:测试当前用户是否有权限读取(Read)

-w:测试当前用户是否有权限写入(Write)

-x:测试当前用户是否可执行(Excute)该文件

-L:测试是否为符号连接(Link)文件

如何判断当前所在的工作目录是否为 /usr/src?
[ $PWD = “/usr/src” ] && echo “YES” || echo “NO”

[root@localhost ~]# [  -d /etc/vsftpd  ]
[root@localhost ~]# echo $?
0   ==>返回值为0,表示上一步测试的条件成立
[root@localhost ~]# [  -d /etc/hosts  ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ -e /media/cdrom ] && echo "YES"   ==>如果测试的条件成立则输出“YES”
YES 
[root@localhost ~]# [ -e /media/cdrom/Server ] && echo "YES“
[root@localhost ~]#

    上述&&是“与”的意思,“… && echo YES”表示如果没有输出,则表示前面执行的测试条件不成立或命令出错。(备注:l测试文件是否可写(-w)时,不要以root用户(特权用户)的身份执行测试,否则可能会无法准确判断)

整数值比较:[  整数1  操作符  整数2  ]

常用的测试操作符

-eq:等于(Equal)

-ne:不等于(Not Equal)

-gt:大于(Greater Than)

-lt:小于(Lesser Than)

-le:小于或等于(Lesser or Equal)

-ge:大于或等于(Greater or Equal)

 

[root@localhost ~]# who | wc -l
5
[root@localhost ~]# [ `who | wc -l` -le 10 ] && echo "YES"  ==>如果登录用户数小于或等于10则输出YES
YES 
[root@localhost ~]# df -hT | grep "/boot" | awk '{print $6}'
12% 
[root@localhost ~]# BootUsage=`df -hT | grep "/boot" | awk '{print $6}' | cut -d "%" -f 1`

解释: df -hT                查看所有分区的磁盘空间使用情况

grep “/boot”          过滤出关于/boot分的数据行

awk ‘{print $6}’      以空格为分隔符,只取第六个字段数据

cut -d “%” -f1        以%为分隔符,只取第一个字段数据

[root@localhost ~]# echo $BootUsage
12
[root@localhost ~]# [ $BootUsage -gt 95 ] && echo "YES"  ==>如果/boot分区的磁盘使用率超过95%则输出YES

条件测试操作:[  字符串1 =  字符串2  ]

常用的测试操作符

=:字符串内容相同

!=:字符串内容不同,! 号表示相反的意思

-z:字符串内容为空

[root@localhost ~]# read -p "Location:" FilePath
Location:/etc/inittab
[root@localhost ~]# [ $FilePath = "/etc/inittab" ] && echo "YES" ==>如果键入路径与指定的目录一致则输出YES
YES 
[root@localhost ~]# [ $LANG != "en.US" ] && echo $LANG  ==>如果当前的语言环境不是en_US,则输出LANG变量的值
zh_CN.UTF-8 

(字符串比较可以用于检查用户输入,例如在提供交互式操作时,判断用户输入的选择项是否与指定的变量内容相匹配)

逻辑测试:[  表达式1  ]  操作符  [  表达式2  ]

     常用的测试操作符

-a或&&:逻辑与,“而且”的意思(前后两个表达式都成立时整个测试结果才为真,否则为假)

-o或||:逻辑或,“或者”的意思(操作符两边至少一个为真时,结果为真,否则结果为假)

!:逻辑否( 当指定的条件不成立时,返回结果为真)

[root@localhost ~]# echo $USER
root
[root@localhost ~]# [ $USER != "teacher" ]  &&  echo "Not teacher" ==>如果发现用户不是teacher,则提示“Not teacher”
Not teacher
[root@localhost ~]# [ $USER = "teacher" ]  ||  echo "Not teacher"
Not teacher  

逻辑测试指的是:同时使用两个(或多个)条件表达式时,判断它们之间的关系

  if语句结构——当“条件成立”时执行相应的操作

      单分支:

if  条件测试命令 

    then   命令序列

fi                                      

  if语句简单应用示例

#!/bin/bash
temp=2
if [  $temp -eq 2  ]
then 
    echo 'temp is 2'
fi

   保存为test文件,并将它设置为可执行(+x)

[jzhou@localhost ~]# chmod 775 test
[jzhou@localhost ~]# bash test
temp is 2

     (备注:lthen可以写到与if一行,但要用分号隔开,例如: if  [  $RATE  -gt  80  ]  ;  then)

  单分支:

if  条件测试命令 

    then  命令序列1 

    else  命令序列2

fi

 

判断mysqld是否在运行,若已运行则输出提示信息,否则重新启动mysqld服务

#!/bin/bash
service mysqld status &> /dev/null 
if  [  $?  -eq  0  ]   ==>判断上句是否执行成功
    then
        echo  "mysqld service is running."
    else
        /etc/init.d/mysqld  restart
fi

 

 

提示用户输入一个整数,如何判断该值是否小于100?
read  “Input an integer:” NUM ; 
           if  [ $NUM  -lt  100 ] ; then
               echo “小于100”
           else
              echo  “大于或等于100”
           fi

 

  多分支: 

if  条件测试命令1  ;  then

    命令序列1

elif  条件测试命令2  ;  then

    命令序列2

elif  ...

else

    命令序列n

fi

  for循环语句——根据变量的不同取值,重复执行一组命令操作

   for语句的结构

for  变量名  in  取值列表

do

    命令序列

done

   for语句简单应用示例

 

依次输出3条文字信息,包括一天中的“Morning”、“Noon”、“Evening”字串
[root@localhost ~]# vi showday.sh
#!/bin/bash
for TM in "Morning" "Noon" "Evening"
do
    echo "The $TM of the day."
done 

 

[root@localhost ~]# sh showday.sh
The Morning of the day.
The Noon of the day.
The Evening of the day 

 

 示例2:获得用户的满足条件的文件数
#!/bin/bash DIR="/opt" LMT=100 ValidUsers=`grep "/bin/bash" /etc/passwd | cut -d ":" -f 1` ==>获得使用bash作为登录shell的用户名列表 for UserName in $ValidUsers do Num=`find $DIR -user $UserName | wc -l` if [ $Num -gt $LMT ] ; then echo "$UserName have $Num files." fi done

 

[root@localhost ~]# sh chkfileown.sh
root have 6737 files.
teacher have 344 files. 
linux从入门到精通(37)

热点推荐

登录注册
触屏版电脑版网站地图