热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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



目录

  • 什么是Shell

  • 脚本的运行方法

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

  • 结合案例分析变量类型

  • 特殊变量及其$@ $*的区别

  • 退出状态

  • 算数运算

  • 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 --     清空所有位置变量


五、特殊变量及其$@ $*的区别

    特殊变量

        $?   上个命令的退出状态

        $0   当前脚本的文件名

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

        $@   传递给脚本或函数的所有参数(每个参数作为一个独立的字符)

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

        $$   当前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个参数)

    $@ $*的区别

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

        写两个脚本实验$*,$@的区别:

        vim b.sh        
        #!/bin/bash
        echo '$@是' $1

       保存退出

        vim a.sh            
        #!/bin/bash
        echo '$*是' $*
        /app/b.sh $@

       保存退出

        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
       $@是 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脚本知识点总结


推荐阅读
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
author-avatar
用户3w7mnpewca
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有