• shell脚本入门


    前言

    (1)如果有嵌入式企业需要招聘校园大使,湖南区域的日常实习,任何区域的暑假Linux驱动实习岗位,可C站直接私聊,或者邮件:zhangyixu02@gmail.com,此消息至2025年1月1日前均有效
    (2)在Linux开发中,我们有些操作可能会需要多条指令,每次都在终端输入这么多条指令,难免会有些麻烦。
    (3)例如我们修改设备树,然后将dts文件编译,烧录进入开发板,重启开发板。这个过程需要进行的操作非常多,而且每次修改设备树都需要进行这些操作,无疑是非常麻烦的。于是为了自动化处理这个过程,前人退出了shell脚本。
    (4)声明:本文是根据正点原子视频教程和鸟哥的私房菜所编写。

    shell实操

    打印hello world

    (1)创建一个shell脚本文件,".sh"后缀的文件就是shell脚本文件。于是我们可以输入touch指令,创建第一个shell脚本。

    touch shell_test1.sh
    
    • 1

    (2)在我们编写shell脚本的时候,是使用的是 bash 。所以,必须要以『 #!/bin/bash 』来宣告这个文件内的语法使用 bash 的语法!
    (3)因此每一个shell脚本的第一行永远是 “#!/bin/bash”
    (4)利用echo指令输出字符串。退出保持,然后执行./shell_test1.sh 即可。

    #!/bin/bash
    echo "hello world!"
    
    • 1
    • 2

    在这里插入图片描述

    利用read指令读取终端数据

    (1)在shell中,read用于读取终端数据,如果没有额外的指令,例如"-p",就会将读取到的终端数据存储进入read后面的变量中。
    (2)因为我们读取数据,肯定需要告诉用户,我们要得到啥数据。先调用echo,然后再执行read有点略显麻烦。于是read指令有一个"-p"参数,可以先输出字符串,然后再读取数据。因此,read -p 等价于 先echo 再read
    (3)使用**$+变量**,可以引用变量。

    #!/bin/bash
    echo "please input name:"
    read name
    echo "your name:" $name
    
    read -p "input your age and height:" age height
    echo "your age = $age,your height = $height"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    (4)执行效果如下

    在这里插入图片描述

    对变量进行加减法运算

    (1)shell脚本只支持整型的数值运算,公式为$ (( $表达式 ))

    #!/bin/bash
    echo "please input two int num:"
    read -p "first num:" first
    read -p "second num:" second
    total=$(($first+$second))
    echo "$first + $second = $total" 
    total=$(($first-$second))
    echo "$first - $second = $total" 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    (2)运行结果如下

    在这里插入图片描述

    利用test命令测试文件是否存在

    (1)test命令可以用于查看文件是否存在,以及他的访问权限问题。
    (2)
    <1>cmd1 && cmd2 ,当cmd1执行完毕并且正确,cmd2执行,否则cmd2不执行。
    <2>cmd1 || cmd2 ,当cmd1执行完毕并且正确,cmd2不执行,否则cmd2执行。
    <3>分析下面这个指令,test -e $ filename这条指令正确,因为是&&,所以echo "filename exist"会执行。因为echo "filename exist"会执行,而且这里是||,所以 echo "$ filename no exist"不会被执行。
    <4>假如test -e $ filename这条指令错误,因为是&&,所以echo "filename exist"不会执行。因为echo "filename exist"不会执行,而且这里是||,所以 echo "$ filename no exist"会被执行。

    在这里插入图片描述

    #!/bin/bash
    echo "please input two int num:"
    read -p "file name:" filename
    test -e $filename && echo "filename exist" || echo "$filename no exist"
    
    • 1
    • 2
    • 3
    • 4

    利用test命令测试两个字符串是否相等

    (1)利用test指令测试两个字符是否相等,和C语言差不多。直接看实例吧。

    在这里插入图片描述

    #!/bin/bash
    echo "please input two string:"
    read -p "first string:" firststr
    read -p "second string:" secondstr
    test $firststr == $secondstr && echo "secondstr == firststr" || echo "firststr != secondstr"
    
    • 1
    • 2
    • 3
    • 4
    • 5

    利用[]测试两个字符串是否相等

    (1)在shell中使用 [] 测试字符串是否相等。
    (2)这里有两个需要注意的点:
    <1>使用$+变量的时候,需要加上双引号,否则你这个字符串里面有空格的话,他不会将其认为是字符串的一部分。
    <2>字符串和左"[“与右”]",都需要加上一个空格。

    #!/bin/bash
    echo "please input two int num:"
    read -p "first string:" firststr
    read -p "second string:" secondstr
    [ "$firststr" == "$secondstr" ] && echo "secondstr == firststr" || echo "firststr != secondstr"
    
    • 1
    • 2
    • 3
    • 4
    • 5

    获取shell脚本参数

    (1)$ 0 ~ $ n可用于表示shell脚本参数。shell脚本命令本身是$ 0,比如,我们这个文件名为shell_test7.sh。那么输入./shell_test7.sh运行脚本的时候,$ 0 = ./shell_test7.sh。
    (2)$ #:用于表示最后一个参数的标号,例如我们输入./shell_test7.sh s dd 。$ 0 = ./shell_test7.sh,$ 1 = s,$ 2 = dd。因此$ #最终得到的最后一个参数dd的下标,即为数字2。
    (3)$ @:用于表示$ 1 ~ $ n的集合,例如输入./shell_test7.sh s dd,那么$ @ = s dd。

    #!/bin/bash
    echo "file name:" $0
    echo "total param num" $#
    echo "whole param" $@
    echo "first param" $1
    echo "second param" $2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    条件判断

    if elif else fi

    (1)shell可以通过&&和||实现简单的条件判断,但是如果条件判断之后,我们想执行一堆的指令,怎么办呢?
    (2)很显然,&&和||已经无法满足要求。于是,我们可以使用

    #格式
    # if [条件判断];then
    #	//当条件判断式成立时,可以进行的指令工作内容
    # fi //<—— 将 if 反过来写,就成为 fi 啦!结束 if 之意
    
    # 或者
    
    # if [条件判断];then
    #	//当条件判断式成立时,可以进行的指令工作内容
    # elif [条件判断];then
    #	//当条件判断式成立时,可以进行的指令工作内容
    #else
    #	//当条件判断式成立时,可以进行的指令工作内容
    # fi //<—— 将 if 反过来写,就成为 fi 啦!结束 if 之意
    
    #————————————————————————
    
    #!/bin/bash
    read -p "please input(Y/N)" value
    if [ "$value" == "Y" ];then
            echo "your input is Y"
    elif [ "$value" == "N" ];then
            echo "your input is N"
    else
            echo "please input(Y/N)"
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    在这里插入图片描述

    case in esac

    (1)在学习C语言的,我们都知道,如果判断条件比较多的时候应当采用switch case语句,这里同理。当我们shell脚本需要进行多个条件判断的时候,可以使用case语句判断。
    (2)下面的示例请注意,$ 1表示你在终端输入的第二个参数。详情请看上面的获取shell脚本参数

    #格式
    # case $变量 in
    #        "第1个变量内容")
    #                //代码段
    #                ;;  //<—— 每个类别结尾使用两个连续的分号来处理
    #        "第2个变量内容")
    #                //代码段
    #                ;;  //<—— 每个类别结尾使用两个连续的分号来处理
    #        "第n个变量内容")
    #                //代码段
    #                ;;  //<—— 每个类别结尾使用两个连续的分号来处理
    # esac  //<—— 将 case 反过来写,就成为 esac  表示结束case条件判断
    
    #————————————————————————
    
    #!/bin/bash
    case $1 in  
            "a")
                    echo "param is a"
                    ;;
            "b")
                    echo "param is b"
                    ;;
            *)
                    echo "can't identify!"
    esac
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    在这里插入图片描述

    循环语句

    while do done

    (1)shell的指令是从第一行往下执行的,首先进入while语句,会发现value这个变量不存在,所以进入do中的代码。执行完成之后,在进行while判断,直到判断失败,就退出循环。

    #格式
    # while [判断式]
    #do   //循环开始
    #	//代码段
    #done
    
    #————————————————————————
    
    #!/bin/bash
    while [ "$value" != "close" ]
    do
            read -p "please input str:" value
    done
    
    echo "stop while"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    until do done

    (1)这个和while do done刚好相反,条件不成立的时候循环,条件成立了之后就不循环了。

    #格式
    # until [判断式]
    # do   //循环开始
    #	//代码段
    #done
    
    #————————————————————————
    
    #!/bin/bash
    until [ "$value" == "close" ]
    do
            read -p "please input str:" value
    done
    
    echo "stop until "
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    for in do done

    (1)如果学习过python,那么这个循环应该就会比较熟悉。用法差不多。
    (2)我们在in后面传入变量,然后这些变量都会传入循环遍历中依次执行。

    #格式
    # for [循环变量] in 传入的变量
    # do   //循环开始
    #	//代码段
    #done
    
    #————————————————————————
    
    #!/bin/bash
    for char in a b c d abcd
    do
            echo "char is :$char"
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    for(())循环数值处理

    (1)和C语言的for语句使用差不多,不过唯一需要注意的一点在于,shell的for需要两个(),而C语言的只需要一个()。

    #格式
    # for((初始值;判断语句;执行步数))
    # do   //循环开始
    #	//代码段
    #done
    
    #————————————————————————
    
    #!/bin/bash
    read -p "please input count:" count
    
    total=0
    
    for((i=0;i<=count;i=i+1))
    do
            total=$(($total+$i))
    done
    
    echo "1+2+...+$count=$total"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述

    自定义函数

    不传参

    (1)在shell中,创建自定义函数,需要关键字function + 函数名。之后就可以在{}中假如代码了。
    (2)如果需要调用自定义函数,只需要函数名即可,而不是像C语言那样,函数名+()。

    #格式
    # function 函数名()
    #{
    #	//代码段
    #}
    
    #————————————————————————
    
    #!/bin/bash
    function help(){
            echo "thise is help cmd!"
    }
    function close(){
            echo "thise is close cmd!"
    }
    
    case $1 in
            "-h")
                    help
                    ;;
            "-c")
                    close
                    ;;
    esac
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    传参

    (1)这里的函数传参不像c语言,函数名(参数1,参数2)。
    <1>shell脚本传参:函数名 [空格] 参数1 [空格] 参数2
    <2>如果需要调用参数,就是执行$ n。和上面 获取shell脚本参数部分类似。

    #格式
    # function 函数名()
    #{
    #	//代码段
    #   调用参数1:$1
    #   调用参数2:$2
    #   ...
    #   调用参数n:$n
    #}
    
    # 函数名 [空格] 参数1 [空格] 参数2 [空格] ... [空格] 参数n
    #————————————————————————
    
    #!/bin/bash
    function print(){
            echo "param 1:$1"
            echo "param 2:$2"
    }
    print a b
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    二、防火墙-安全策略
    设计模式-行为型-中介者模式
    2022 年牛客多校第九场补题记录
    SpringBoot + JWT + Redis 开源知识社区系统
    【初阶数据结构】带头双向循环链表(C语言实现)
    随机函数变换示例
    抽空写了个小游戏(未完待续)
    大模型的无限上下文与数据集组合艺术
    validator库的使用详解
    PgSQL-内核特性-TupleTableSlotOps
  • 原文地址:https://blog.csdn.net/qq_63922192/article/details/132607077