Shell基本知识

Linux Shell脚本基础
  1. 什么是LinuxShell脚本和怎么执行脚本?

//https://blog.youkuaiyun.com/sunxiwang/article/list/2?t=1

shell中的判断与循环

  • 什么是Shell

shell是外壳的意思,就是操作系统的外壳。我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就包括lscdpwd等等。总结来说,Shell是一个命令解释器,它通过接受用户输入的Shell命令来启动、暂停、停止程序的运行或对计算机进行控制。

二、什么是脚本?

脚本就是由Shell命令组成的文件,这些命令都是可执行程序的名字,脚本不用编译即可运行。它通过解释器解释运行,所以速度相对来说比较慢。

三、Linux中有哪些脚本解释器?

dashbash两种,但dash没有bash功能全面,所以通常使用bash。可以通过命令来查看系统中的脚本解释器ls – l/bin/*sh

     https://i-blog.csdnimg.cn/blog_migrate/f2c67b5bd5f19fc20f3e914d2842fb00.png

  • 怎么执行脚本文件?

先创建一个脚本文件 script.sh  后缀名是 .sh

#!/bin/bash

echo "this is the first shell script"

注意:执行之前首先要为脚本文件添加可执行权限,不然就得用root权限才能执行!

添加可执行权限: chmod  +x  script.sh   回车

 <1>第一种执行方式

dash/bash   script.sh    回车

<2>第二种执行方式

 ./script.sh     回车

 这两中执行方式有什么区别呢?

  区别:第一种方式,使用/bin/sh所指向的shell解释器来执行脚本文件

第二种方式,它默认使用/bin/sh所指向的shell解释器来执行脚本文件,前提是脚本文件中未指定解释器。但如果在脚本文件中指定了使用哪种脚本解释器,那么它就不管/bin/sh指向哪个脚本解释器,而是使用脚本文件中所制定的那个脚本解释器。

在脚本文件中指定脚本解释器: #!/bin/bash

<3>第三种执行方式

 指定脚本文件的绝对路径,即可执行

  举例 /home/liutao/LinuxStudy/shellStudy/script.sh  回车

这种执行方式选择使用的脚本解释器和第二种相同。

执行脚本文件后输出截图

            https://i-blog.csdnimg.cn/blog_migrate/0df87a8557004fc90e52687da3bdb815.png

  1. Shell脚本的基本语法(一) if判断、for循环、while循环和until循环

注释

       Shell中的注释标志是井号 "#",除了脚本文件第一行的#不是注释之外,其他地方出现#,则说明#开始,到本行的末尾都是注释

指定脚本解释器

       一般每个Shell脚本文件的第一行都是指定脚本解释器

       #!/bin/bash       指定本脚本文件使用bash脚本解释器解释执行

if 判断语法

       <1>、判断大小

     首先Shell中判断两个数字大小的方式:

              -gt(大于)  -lt(小于)  -eq(等于)  -le(小于等于)  -ge(大于等于)

       判断两个字符串的方式:

              >(大于)    <(小于)   ==(等于)   >=(大于等于)   <=(小于等于)

       <2>、通过实例来描述if语法

 

https://i-blog.csdnimg.cn/blog_migrate/7d62ed84afb3db8ae7b9449643b16645.png

1.if语句

  • shell中的if语句结构如下,它通过判断command1的返回值,若0(即命令成功执行)则执行command2command3;若1则不执行

if commandA

then

    command1

    command2

fi

#另一种风格的写法

if commandA ; then

    command1

command2

fi

1

  • 当然shell中也有else,还有elseif,用法分别如下:

if commandA ; then

    command1

else

    command2

fi

 

if commandA ; then

    command1

elif commanB ; then

    command2

elif commandC ; then

    command3

fi

  • 当需要多次判断时,也可用switch case来替代if else

case $USR in

root)

    echo root

    echo oh!;;

jack)

    echo jack;;

peter | ben)            #满足peterben

    echo hah! hah!;;

*)                      #星号代表默认情况

    echo error;;

esac

2.test语句

  • test命令是if语句的好伴侣,常用来判断条件是否满足,满足返回0,不满足返回1test可以用来比较:数值、字符串、文件/路径。常见用法为:

if test condition ; then       #(“ ; 作为分隔符, then语句换行可将分号; 省略)

    commands

fi

#bash支持的另一种格式,本质也是调用了test,千万要注意在condition和方括号之间加空格

if [ condition ] ; then

    commands

fi

  • test用于数值比较时,基本格式为var1 参数 var2,如下,具体参数有很多,可以上网查

if [ $var1 -eq $var2 ] #判断var1var2变量值是否相等

if [ $var1 -gt 2 ] #判断var1的变量值是否大于2

  • 1
  • test用于字符串比较时,基本格式也为var1 符号 var2,此外还可以使用[[ ]]来使用正则匹配

if [ $string1 = $string2 ] #判断变量string1string2值是否相等

if [ $USR = !root ] #判断变量USR值是否不等于root

if [[ $USR == r* ]] #判断变量USR值是否以字母r开头

  • test用于判断文件和目录的状态时,基本格式为参数 filepath如下,具体参数有很多,可以上网查

if [ -d $MYPATH ] #判断位于$MYPATH的文件是否存在,并且是个目录

if [ -e $MYPATH ] #判断位于$MYPATH的文件是否存在

if [ -r $MYPATH ] #判断位于$MYPATH的文件是否可读

if [ -x $MYPATH ] #判断位于$MYPATH的文件是否可执行

  • test 还可以判断一个变量是否有值

if [ -z "$USR" ] #判断变量USR长度是否为零

if [ -n "$USR" ] #判断变量USR长度是否非零

  • 对于复合判断语句shell中使用&&||来表示,尤其需要注意的是,shell中以命令返回0为真,1位假,故&&||操作以逻辑真假为准,不再以数值上的01为准

if [ condition1 ] && [ condition2 ]

if [ condition1 ] || [ condition2 ]

 

  • 此外&&还能用来作为简易版本的if语句,左边的命令返回真(即返回0),右边的命令才被执行
  • [ $? -ne 0 ] && mk_error "build rootfs Failed" && return 1

    3for循环语法

           <1>、第一种循环方式

     https://i-blog.csdnimg.cn/blog_migrate/bc733ab9375ce7ef6d0c0388ee56ffdf.png

          <2>、第二种循环方式

        https://i-blog.csdnimg.cn/blog_migrate/9e89a11f9af3117fc392d50e0e6a6480.png

    <3>、第三种循环方式

    https://i-blog.csdnimg.cn/blog_migrate/f167fd92077ac424df85a34527e6374d.png

    在此详细说几种算奇数和的方法:

    for i in {1..100..2}

    do

           let "sum+=i"

    done

    //

    for i in $(seq 1 2 100)

    do

          let "sum+=i"

    done

     <4>第四种循环方式

    https://i-blog.csdnimg.cn/blog_migrate/23d298707faf8aa9ba9710936c24a431.png

    类似C语言的风格   ::这种用法与C语言一样,就不在多说

    for((expression1;expression2;expression3))

    do

          循环体

    done

    4while循环语法

    https://i-blog.csdnimg.cn/blog_migrate/524ec492b507fd7775aa9b31d3b60c2a.png

    5until循环语法

           until与其他循环不同,它是判断表达是为假时进行循环。而其他循环是判断条件为真时进行循环,条件为假则跳出循环。(此循环并不常用)

    https://i-blog.csdnimg.cn/blog_migrate/46707f044037d68b9ff82a3e8a9aba73.png

  •  Shell脚本的基本语法(二) 预定义特殊字符、case语句和函数调用
  • 一、Shell中有许多预定义的特殊字符:

     

  •      $n   :n是一个数字(大于10则用大括号括起来,${12}),代表程序的第n个参数

    (注释:$0代表当前使用的shell、在命令行环境下表示当前shell的名称,在脚本中表示当前执行的脚本名称。

    $1...$9:在脚本中用来表示位置参数,即脚本执行时所带的第几个参数的值。 )

           $#   :总共有多少个参数

           $*    :指所有的参数

           $@  :指所有的参数

           $?   : 上次命令执行的返回值

           注意:我们发现$*和$@的意思是一样的,其实它们两个有一个很大的区别:

                      $*  将所有参数放在一块内存中,以空格分隔

                      $@ 将每个参数分别放在一块内存中,相当于字符串数组

    https://i-blog.csdnimg.cn/blog_migrate/ed91b6fac9589a8a25d621438756778f.png

    二、case语句,shell中的开关语句

            shell中的开关语句有许多地方和C语言是类似的我们可以通过对比两个就可发现其相似之处。

    https://i-blog.csdnimg.cn/blog_migrate/2a985b1d0823a9320a18f5d064fe7e2d.png

     

    不同之处:

    C语言中每个开关结束时,必须以break跳出。如果不跳的话继续向下执行。

    而在shell中每个开关是以双分号;;来跳出的。如果不跳则出现语法错误。

    三、shell中的函数调用

    shell中的函数可以有参数,也可以有返回值。

    但是它没有形参列表,没有返回值类型,而且取返回值的方式也与众不同。

    https://i-blog.csdnimg.cn/blog_migrate/cec506e882925333af71e73697084d2d.png

    4Shell脚本实例(一) 监控一个程序的运行情况

     

  • 一、问题描述:

        监控指定程序是否运行,如果程序没有运行,那么启动程序。

    二、解决思路:

        <1>、我们判断一个程序是否运行,可以通过查看该程序的进程信息来判断。

        例: 判断程序 01FirstScript.sh 是否在运行;

         命令:ps -ef  |  grep  01FirstScript.sh | grep  -v  grep

         结果分析: 如果命令执行之后有输出,即输出进程信息。则说明程序正在运行,如果执行之后没有输出,则说明程序没有运行

         <2>、如何监控指定的程序?

         我们可以将指定程序的名字作为监控程序的参数传递进去,在内部实现时,通过死循环来不断监控

         <3>、如果程序未运行,如何启动程序?

         在判断程序为运行时,如果指定程序名是监控程序的第一个参数。可以通过下面命令启动指定程序

    sh  $1

    三、脚本代码实现:

    #!/bin/bash

    #进程监控脚本

    #功能需求: 监控程序是否运行,如果程序没有运行,那么启动程序。

    while [ true ]

    do

             pro=$(ps -ef | grep "$1" | grep -v grep | grep -v "$0")

             #过滤出目标进程信息,如果pro为空串说明目标进程未运行

            #反向过滤掉grep进程 和 本进程信息, 因为这两个进程信息中包含目标进程的名字

             if [ -z "$pro" ]

             then

                      echo "程序未启动,重新启动程序"

                       sh $1    #重新启动指定程序

             else

                      echo "程序正在运行..."

             fi

             sleep 0.5

    done

    四、运行结果截图:

    https://i-blog.csdnimg.cn/blog_migrate/12a3ba1904f858017ea3dea5a77ebcee.png

    五、程序运行过程说明:

         <1>、一开始指定程序并未运行

         <2>、然后监控进程检测指定程序未运行,随即启动指定程序

         <3>、指定程序开始运行

         <4>、在中途使用kill命令终止指定程序进程

         <5>、监控进程再次检测到指定程序未运行,随即启动指定程序

         <6>、指定程序开始运行

    程序调试心得:

    bash  my_1_shell.sh  my_first_shell.sh

    bash  ./my_1_shell.sh  ./my_first_shell.sh     #(./指定当前路径)

     

    注释:启动“my_1_shell.sh”判别程序“my_first_shell.sh”是否启动,如果没有启动就启动“my_first_shell.sh”程序;

    bash ./my_first_shell.sh | bash ./my_1_shell.sh

     

    注释:先启动程序“my_first_shell.sh”,利用“my_1_shell.sh”判定“my_first_shell.sh”程序是否启动;

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值