• shell练习


    一、流程

    1. 新建shell 脚本 :touch test.sh
    2. 编辑脚本: vim test.sh
    3. 赋予权限: chmod 777 test.sh
    4. 运行脚本 : ./test.sh

    二、变量

    1. 变量赋值 :a="菜鸡滴滴"
    2. 打印变量: echo $a
    3. 只读变量
      使用 readonly 命令将变量定义为只读
    a=”菜鸡滴滴“
    readonly a
    
    • 1
    • 2
    1. 删除变量 : unset a

    三、shell字符串

    1. 单双引号:字符串可以使用单引号或者双引号,也可以不用引号
    2. 字符串拼接
    a="菜鸡滴滴"
    b=123
    c="$a$b"
    #或者 c=$a$b
    echo $c
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 获取字符串长度:${#string}
    a="菜鸡滴滴"
    b=123
    c=$a$b
    # readonly a
    echo $c
    d=${#c}
    echo $d
    #或者直接输出 echo ${#c}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. 字符串提取
      1. 从指定位置开始提取
        • 从字符串左边开始计数:${string:start:length} ,其中start从0开始,length省略表示到字符串结尾
        • 从右边开始计数:${string:0-start:length},与左边开始相比,仅仅多了-0,这是固定格式。从右边开始时计数从1开始
        • 不管哪种方式,截取方向都是从左到右
    a="菜鸡滴滴"
    b=123
    c=$a$b
    # readonly a
    echo $c
    d=${#c}
    e=${c:0-2:2}
    echo $e
    # 输出:23
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1. 从指定字符串(子字符串)开始截取: 这种截取方式无法指定字符串长度,只能从子字符串截取到字符串末尾。(

    四、shell 数组

    1. 定义:array_name=(ele1 ele2 ele3 ele4 … elen) (注意赋值号=两边不能有空格)。
    2. Shell 为弱类型,不要求所有数组元素的类型相同
    3. 获取数组元素的值:${array_name[index]}
    4. 使用@或者* 可以获取数组中所有的元素:${nums[*]}或者${nums[@]}
    arr=(1 2 3 "菜鸡滴滴")
    arr[10]=9
    echo ${arr[@]}
    
    • 1
    • 2
    • 3
    1. 获取数组元素个数:${#array[@]} 或者${#array[*]}
    arr=(1 2 3 "菜鸡滴滴")
    arr[10]=9
    echo ${arr[@]}
    echo ${#arr[@]}
    #结果:
    #1 2 3 菜鸡滴滴 9
    #5
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    1. 数组拼接arr_new=(${arr1[@]} ${arr2[@]})

    2. 删除数组元素:unset关键字

      • 删除单个元素:unset arr[index]
      • 删除整个数组:unset arr

      五、Shell 内置命令

      bash 自身提供的命令,而不是文件系统中某个执行文件

      1. type来确定一个命令是否为内置命令
        在这里插入图片描述
      2. alias: 给命令创建别名
        • 直接使用 alias 则列出当前Shell进程中使用的别名
          在这里插入图片描述
      • 自定义别名: alias new_name='command',这样定义的只能在当前shell 进程中使用
      • 配置自己的alias :
        1. 修改 ~/.bashrc 文件: vi ~/.bashrc
        2. 在文件中添加自己的alias语句
        3. 立即生效: source ~/.bashrc
      1. echo: 输出字符串
      • 不换行: 加上-n 参数

        name="Tom"
        age=20
        echo -n "${name} is ${age} years old" 
        
        • 1
        • 2
        • 3
      • 解析转义字符:加上 -e 参数

      • 在有 -e 参数时,也可使用 转义字符 \c 来命令不换行
        在这里插入图片描述

      1. read命令:读取键盘输入的数据
        在这里插入图片描述
      2. $$ 、$!、$?获得进程ID信息
        • $$ :获得当前进程的ID

        • $! : 获得上一个进程的ID

        • $? : 获得上一个进程结束的状态码

        • 例子:

          echo "当前进程id : $$"
          sleep 100 &
          echo "上一个进程的id: $!"
          echo "上一个结束的进程状态码:$?"
          
          • 1
          • 2
          • 3
          • 4
          #结果:
          #当前进程id : 13797
          #上一个进程的id: 13798
          #上一个结束的进程状态码:0
          # $$获取当前的进程id为13797,之后后台执行sleep,这个后台进程为13798(可用ps命令验证),接着是$? ,输出上一个结束进程的状态码,上一个结束的进程为echo,顺利结束则为0
          
          • 1
          • 2
          • 3
          • 4
          • 5

      6.exit 退出当前进程

      • exit 为Shell 内置命令,用来退出当前Shell进程 ,并返回一个退出状态,可以用 $?(上一个结束进程状态码) 来接收这个退出状态。

      • exit 命令可以接收一个整数值作为参数,代表退出状态,如果不指定,默认状态值为0。一般情况下,退出状态为0表示成功,为非0表示失败。

      • 例子:

        #!/bin/bash
        echo "befor exit"
        exit 8
        echo "after exit"
        # 结果为:before exit。而after exit并未输出
        
        • 1
        • 2
        • 3
        • 4
        • 5

        接着使用echo $? 获取退出状态码,获得退出状态为:8

      1. Shell 数学运算
        如果不特别指明,每一个变量的值都是字符串。常用的数学计算如下。
        在这里插入图片描述

      2. if else 语句

        # 格式如下
        if  condition
        then
            statement(s)
        fi
        # condition为判断条件
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6

        注意if后面有个then
        或者

        if  condition
        then
           statement1
        else
           statement2
        fi
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6

        或者

        if  condition1
        then
           statement1
        elif condition2
        then
            statement2
        elif condition3
        then
            statement3
        ……
        else
           statementn
        fi
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13

        也可以将then 和if 写在一行上:
        这样写if和elif后面都有then

        bash
        if  condition;  then
            statement(s)
        fi
        
        • 1
        • 2
        • 3
        • 4

        注意condition后的分号,当if 和then位于同一行时,这个分号是必须的

      3. test 命令
        test是Shell 内置命令,用来检测某个条件是否成立。test通常与if语句一起使用。
        test命令有很多选项,可以进行数值、字符串、文件三个方面的检测
        Shell test的命令用法:test expression,也可以简写为[ expression ],[]和expression之间的空格是必须的

        • 例子

          read age
          
          if test $age -le 2; then
          	echo "婴儿"
          elif test $age -ge 3 && test $age -le 8;then
          	echo "幼儿"
          elif [ $age -ge 9 ] && [ $age -le 17 ];then
          	echo "少年"
          elif [ $age -ge 18 ] && [ $age -le 25 ];then
          	echo "成年"
          elif [ $age -ge 26 ] && [ $age -le 40 ];then
          	echo "中年"
          else 
          	echo "老年"
          fi
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15

        其中 -le 选项表示小于等于, -ge表示大于等于

        • 与文件检测相关的test 选项
          在这里插入图片描述

        • 与数值变焦相关的test选项
          在这里插入图片描述
          注意test只能用来比较整数,小数相关的比较还是得依赖bc命令

        • 与字符串判断相关得test选项
          在这里插入图片描述
          在test中,==、>、<只能用来比较字符串,不能用来比较数字。其次,无论是数字还是字符串,test都不支持>= 和 <= 运算符。

          read str1
          read str2
          # 检测字符串是否为空
          if [ -z "$str1" ] || [ -z "$str2"] ;then
          	echo "字符串不能为空"
          	exit 0
          fi
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
        • 与逻辑相关得test选项

          1. expression1 -a expression2 : 逻辑与
          2. expression1 -o expression2:逻辑或
          3. !expression : 逻辑非
        • 在test中使用变量建议用双引号包围起来,以防止空字符串

      4. [[]] : 检测条件是否成立,test的升级版

        • 在使用[[]] 时,不需要用“” 将变量引起来,即使为空值也不会出错
        • 不需要也不能对 >、< 进行转义,否则会出错
        • [[]] 剔除了 -o和-a 选项,只能使用&&和||
        • [[]]支持正则表达式,可以使用=~判断是否符合某个正则表达式,即[[ str =~ regex ]]
        • 不过[[]] 对数字处理还是不友好,可以使用(()) 处理整形数字,用[[]] 处理字符串或者文件
      5. while 循环

        while condition
        do
        	statements
        done
        
        • 1
        • 2
        • 3
        • 4
      6. for 循环和for int 循环

        1. c风格
        for((exp1;exp2;exp3))
        do
        	statements
        done
        # exp2为判断条件
        
        • 1
        • 2
        • 3
        • 4
        • 5

        2.python 风格

        for variable in value_list
        do 
        	statements
        done
        
        • 1
        • 2
        • 3
        • 4

        对value_list的说明:

        • 给出具体数值:for i in 1 2 3 4 5
        • 给出取值范围:for i in {1..100} 范围的具体格式为:{start..end}
        • 使用命令的执行结果:for i in $(seq 2 2 100),$() 可以取得命令的执行结果,seq用来产生某个范围内的整数,2起始,100结束,步长为2。再如 :for i in $(ls *.sh)
        • 使用Shell通配符:for i in *.sh
        • 使用特殊变量:for i in $@,还有:$#、$*、$@、$?、$$
  • 相关阅读:
    vue3项目服务器静态文件部署增加指定路由地址完整实现
    【Java】内部类、File类、线程优先级
    万字长文详解开源流式湖仓服务Arctic
    java中拦截器和过滤器的区别和联系?
    有什么好用的站内搜索SaaS能帮网站实现站内搜索功能?
    使用React和Node构建实时协作的白板应用
    排序算法——稳定性及其汇总
    [当人工智能遇上安全] 9.基于API序列和深度学习的恶意家族分类实例详解
    Python学习笔记(23)-Python框架22-PyQt框架使用(布局简介)
    高校评教教师工作量管理系统设计与实现
  • 原文地址:https://blog.csdn.net/m0_45210226/article/details/126924742