linux学习—shell脚本知识点总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux学习—shell脚本知识点总结相关的知识,希望对你有一定的参考价值。

Shell脚本 --Shell脚本有点像早期的批处理文件,将一些命令汇总起来一次执行,但Shell有更强大的功能,可以类似于程序的编写,不需要编译就能执行,使用起来很方便,可以简化我们日常的管理工作



目录

  • 什么是Shell

  • 脚本的运行方法

  • #!(读shabang)的作用详解

  • 结合案例分析变量类型

  • 特殊变量及其[email protected] $*的区别

  • 退出状态

  • 算数运算

  • test和[ expression ]判断


一、什么是Shell

     我们知道管理整个计算机硬件的其实是核心(kernel),用户都是以Shell来与核心沟通,只要有操作系统,就离不开Shell。

    如图显示了Shell,用户和硬件的关系,形象的说Shell就是用户控制硬件的一种语言工具。

技术分享图片            技术分享图片


二、脚本的运行方法

    ①chmod u+x 脚本名

      然后直接输入脚本路径执行

        (要求shell脚本中第一行加入#!解释器

        (因为这是文件执行,需要有执行权限

    ②/bin/bash 脚本名

        (如果shell脚本中第一行加入#!解释器,则自动忽略,仍然以bash作为shell

        (这是运用解释器处理文件,所以不需要给文件加执行权限

    总之,上述的两种方法中真正执行永远的都是shell(默认为bash)

    当然#!还可以跟/usr/bin/python,/usr/bin/perl

    脚本调试

      bash -n 脚本路径   语法检测

      bash -x 脚本路径   调试执行,把执行成功的结果显示,不成功的报错


三、#!(读shabang)的作用详解

    先看这个Shell脚本

     #!/bin/bash
     echo "Hello World"

    当没有#!的时候,默认/bin/bash

        举个例子加深#!的作用:

  vim test.rm
  #!/bin/rm -f
  echo hello world

        保存退出

        ls    发现多了一个text.rm的文件

  /bin/bash test.rm
  结果显示 hello world
 chmod u+x test.rm
 ./test.rm

         没有显示任何信息

         ls    发现test.rm文件没有了

    总结:当运行脚本是bin/bash或/usr/bin/python或/usr/bin/perl + 脚本时,则忽略第一行#!后边的内容,使用手动输入的shell,结果执行例子中的echo;当运行脚本是直接脚本路径时,test.sh调用#!后边的命令,删除该文件,不执行echo.

        # --->后边的内容为注释


四、结合案例分析变量类型

    局部变量

        生效为仅为当前shell(即使子shell也不能)

                A=123             B=$USER                C=$(hostname)

                echo $A           echo $B                echo $C

                echo "$A"456

                echo ${A}456

        set             命令查看所有局部变量

        unset + 变量名  取消指定局部变量和环境变量

    案例:

        1、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬     盘大小          

            #!/bin/bash
            echo ipv4地址:$(ifconfig eth0 |tr "\n" " " |tr -s " " $ |cut -d$ -f7 |cut -d: -f2)
            echo 系统版本:$(cat /etc/redhat-release)
            echo 内核版本:$(uname -r)
            echo 内存大小:$(cat /proc/meminfo |tr "\n" $ |cut -d$ -f1 |grep -o "[0-9]*") KB
            echo 硬盘大小:$(fdisk -l |grep "sda\>" |cut -d: -f2 |cut -d, -f1)
            echo CPU型号:$(cat /proc/cpuinfo |grep "name" |sort -u |cut -d: -f2)

     2、编写脚本/root/bin/backup.sh,可实现将/etc/目录备份到/root/etcYYYY-mm-dd中(date +%F 以年-月-日显示日期             

            #!/bin/bash
            cp -r /etc/ /root/etc$(date +%F)

    环境变量

        当前shell和子shell

           如:A=mage

                echo $A    #显示mage

                bash       #开启当前shell的子shell

                echo $A    #没有显示内容

                说明A只是一个局部变量

        环境变量的声明  

            export + 变量名    

            declare -x 变量名

        查看所有环境变量  

            export , declare -x , env ,printenv

    只读变量

            readonly 变量名  声明只读变量

      readonly -p 查看所有只读变量

    本地变量:通常指函数

    位置变量:传递参数

        $1,$2,...  对应的1等,2等参数

        set --     清空所有位置变量


五、特殊变量及其[email protected] $*的区别

    特殊变量

        $?   上个命令的退出状态

        $0   当前脚本的文件名

        $*   传递给脚本或函数的所有参数(当做一个整体的字符)

        [email protected]   传递给脚本或函数的所有参数(每个参数作为一个独立的字符)

        $#   传递给脚本或函数的参数个数

        $$   当前Shell进程ID

    如:

        vim test.sh        
        echo $1
        echo $2
        echo $3
        echo $#
        /bin/bash ./test.sh 4 5 6 7

        结果显示:4 5 6 4(7多余;共输入了4个参数)

    [email protected] $*的区别

        都表示传递给函数或脚本的所有参数,但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体;"[email protected]" 会将各个参数分开

        写两个脚本实验$*,[email protected]的区别:

        vim b.sh        
        #!/bin/bash
        echo '[email protected]是' $1

       保存退出

        vim a.sh            
        #!/bin/bash
        echo '$*是' $*
        /app/b.sh [email protected]

       保存退出

        chmod +x a.sh b.sh        
        ./a.sh {a..z}

       结果显示:       

       $*是 a b c d e f g h i j k l m n o p q r s t u v w x y z
       [email protected]是 a

六、退出状态

    所谓退出状态,就是上一个命令执行后的返回结果。

     0 代表成功  1-255 代表失败(不同类型)

    $?   保存最近的命令的退出状态,命令执行成功就为0,失败就为1-255

技术分享图片

    小tip:我们可以把变量$?用在判断语句中

     exit [n] 自定义退出状态码

            脚本一旦运行到exit [n],当前shell就会退出,并把n赋值给$?


六、算数运算

    +  -  *  /  %(取余) **(乘方)

    实现算数运算方法:

        (1) let var=算术表达式

        (2) var=$[算术表达式]

        (3) var=$((算术表达式))

        (4) declare –i var= 算数表达式

        (5) echo '算术表达式' | bc

   随机数生成器:$RANDOM(0-32767)---- 相当于一个算数表达式

                 echo $[$RANDOM%50] :0-49之间随机数


七、test和[ expression ]判断

    test + expression

        =或者==     判断两个字符是否相等,并不能判断数字是否相等

    技术分享图片技术分享图片

        !=    判断两个字符不相等

       >     判断两个字符大于

       <     判断两个字符大于(按照ASCII码大小)

       =~    判断两个字符是否匹配 (常用于[[ ]]中,支持扩展正则表达式,两个字符最好用""括起来

        -eq   判断两个数值是否相等(equal)

        -ne   判断两个数值不等(not equal)

        -gt   判断两个数值大于(greater than)

        -ge   判断两个数值大于等于(greater equal)

        -lt   判断两个数值小于(less than)

        -le   判断两个数值小于等于(less equal)

    [ expression ]     

        注意:[ 后边的空格和 ] 前面的空格,必须要有,其实 [ 是一个命令,位于/usr/bin/目录下

        -f    判断是否是普通文件

        -d    判断是否是目录        

        -x    判断是否有执行权限

        -z    判断字符是否为空

        -n    判断字符是否为不空

    test和 [ ] 通用
































以上是关于linux学习—shell脚本知识点总结的主要内容,如果未能解决你的问题,请参考以下文章

Linux学习总结(76)—— Shell 脚本日志技巧

Linux学习总结(76)—— Shell 脚本日志技巧

shell脚本学习总结

Linux学习总结(五十七) shell脚本1

马哥学习linux第2天总结知识

Shell脚本语言学习总结