Linux学习笔记(八)——简单shell语法

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介:                 编写Shell脚本的简单语法   提到编程,条件、分支、循环等语法肯定少不了。shell脚本编程亦是如此,下面只是结合最近学习的一些简单语法做的笔记,如有错误,欢迎指正。

                编写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. 

  while循环语句——重复测试指定的条件,只要条件成立则反复执行对应的命令操作

  while语句的结构

 while  命令或表达式 

 do 

      命令列表

 done

  while语句简单应用示例

批量添加20个系统用户帐号, 用户名依次为“stu1”、“stu2”、……、“stu20”
#!/bin/bash
i=1
while  [  $i  -le  20  ]
do
    useradd stu$i
    echo "123456" | passwd --stdin stu$i &> /dev/null
    i=`expr $i + 1`
done 
批量删除上述添加的20个系统用户帐号
#!/bin/bash
i=1
while  [  $i  -le  20  ]
do
    userdel -r stu$i
    i=`expr $i + 1`
done 

  分支控制语句

  case语句——根据变量的不同取值,分别执行不同的命令操作

case  变量值  in

    模式1)

           命令序列1

           ;;

    模式2)

          命令序列2

           ;;

  ……

    * )

          默认执行的命令序列

esac

(当遇到双分号“;;”后跳转至esac表示结束分支。如果一直找不到相匹配的值,则执行最后一个模式“*)”后的默认命令序列,直到遇到esac后结束分支)

#!/bin/bash 
case   $1   in
    start)
        echo  "Start MySQL service."
        ;;
    stop)
        echo  "Stop MySQL service."
        ;;
    *)
        echo  "Usage:$0  start|stop"
        ;;
esac

(/etc/init.d/ 目录下的各类脚本中,大量使用了case分支语句结构)

#!/bin/bash
read  -p  "Press some key, then press Return:“  KEY
case  "$KEY“  in
  [a-z]|[A-Z])
      echo "It's a letter."
      ;;
  [0-9])
      echo "It's a digit."
      ;;
  *)
      echo "It's function keys、Spacebar or other keys. "
esac

匹配模式中可以使用方括号表示一个连续的范围,例如“[0-9]”;使用竖杠符号“|”表示或,例如“A|B”A或者B

  unitl语句——根据条件执行重复操作

until  条件测试命令

do

      命令序列

done

(•until 循环的结构与while命令类似,“until通过检测其后接命令的返回值“$?”来判断是否退出循环

   •until:直到”测试条件“成立时终止循环,而while是:当”测试条件“成立时进行循环

   •即:until在测试条件为假(非0)时执行循环,条件为真时(0)退出循环,正好与while循环相反)

 

  shift语句——用于迁移位置变量,将 $1~$9 依次向左传递(不常用)

例如,若当前脚本程序获得的位置变量如下:
 $1=file1、$2=file2、$3=file3、$4=file4
则执行一次shift命令后,各位置变量为:
 $1=file2、$2=file3、$3=file4
再次执行shift命令后,各位置变量为:
 $1=file3、$2=file4
通过命令行参数传递多个整数值,并计算总和
[root@localhost ~]# vi showday.sh
#!/bin/bash
Result=0
while  [  $#  -gt  0  ]  ==> $# 为预定义变量,表示位置参数的个数
do
    Result=`expr $Result + $1`
    shift
done
echo "The sum is : $Result"
[root@localhost ~]# ./sumer.sh  12  34  56
The sum is : 102 

  循环控制语句

    break:在for、while、until等循环语句和case中用于跳出当前的循环体,执行循环体后的语句;并不退出程序。执行break命令后将跳到done语句之后。

 

    continue:在for、while、until等循环语句中,用于跳过循环体内余下的语句,重新判断条件以便执行下一次循环

  shell函数应用

  定义新的函数:

   

  调用已定义的函数: 函数名

  向函数内传递参数:函数名   参数1   参数2 ......

#!/bin/bash
adder() {
    echo `expr $1 + $2`
}
adder 12 34
adder 56 789
[root@localhost ~]# sh adderfun.sh
46
845 

(在脚本内部,已经定义的函数就好比“内部命令”一样,可作为执行语句直接使用)

 

 

作者: zhoujie
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,不然我担心博客园找你算账
如果您觉得本文对你有帮助,请竖起您的大拇指右下角点推荐,也可以关注我
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
1月前
|
存储 Shell Linux
Linux 如何更改默认 Shell
Linux 如何更改默认 Shell
36 0
Linux 如何更改默认 Shell
|
2月前
|
Web App开发 网络协议 Linux
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
这篇文章是关于Linux命令的总结,涵盖了从基础操作到网络配置等多个方面的命令及其使用方法。
80 1
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
|
1月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
2月前
|
并行计算 Ubuntu Linux
Ubuntu学习笔记(三):Linux下操作指令大全
Ubuntu学习笔记,介绍了Linux操作系统中常用的命令和操作,如文件管理、系统信息查看、软件安装等。
48 3
|
3月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
3月前
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
781 2
|
3月前
|
存储 Java Shell
shell学习笔记(详细整理)
这篇文章是一份详细的Shell学习笔记,涵盖了Shell的基础知识、脚本编写、变量、运算符、条件判断、流程控制、函数以及常用Shell工具的使用。
71 1
|
4月前
|
Ubuntu Linux 编译器
在ubantu/linux系统出现parse error(语法错误)
本文讨论了在Ubuntu/Linux系统中遇到"parse error"(语法错误)的问题,并提供了将非声明语句移动到所有声明语句下方以解决该问题的解决方案。
在ubantu/linux系统出现parse error(语法错误)
|
3月前
|
Shell
Shell脚本有哪些基本语法?
【9月更文挑战第4天】
85 18