• shell 数组和流程控制


    shell 编程

    变量分类

    1.本地变量:用户私有变量,只有本用户可以使用,保存再家目录下.bash_profile、.bashrc文件中
    2.全局变量:所有用户都可以使用,保存再/etc/profile、/etc/bashrc文件中
    3.用户自定义变量:用户自定义,比如脚本中的变量
    

    变量一般使用全大写,以和命令进行区分

        NAME="My"
        echo $NAME $是读取变量值
    

    终端变量在终端关闭后将会消失,脚本变量关闭后,消失

    定义变量

    在 shel 编程中,变量赋值 = 号不能有空格。
    不能使用关键字
    其他与 C#差不多吧
    如: NAME="My"
    字符串需要使用双引号

    unset NAME 取消变量
    

    source ~/.bash_profile
    家目录环境变量生效

    全局变量

    vim /etc/profile
    export NAME="xxx" # 也可用与终端
    export 表示导出为全局变量

    读取变量内容

    使用取内容符号 ( )NAME

    数组

    基本数组

        #!/bin/bash
        # 定义数组,空格隔开
        ARRAY1=(1 2 3 4 5)
        echo ${ARRAY1[1]}
    
        # 将/etc/passwd 中每一行赋值到数组ARRAY2
        ARRAY2=(`cat /etc/passwd`)
    

    查看数组

    declare -a # 查看已经生命过的数组

    访问数组元素

        echo ${array1[0]} # 访问数组中的第一个元素
        echo ${array[@]} # 访问数组中所有的元素
        echo ${#array1[@]} # 获取数组的长度
        echo ${!array2[@]} # 获取数组元素索引
        echo ${array1[@]:1} # 从数组下标1开始
        echo ${array1[@]:1:2} # 从数组下标1开始,访问两个元素
    

    关联数组-类似 Dictionary_csharp

        # 关联数组
        declare -A ass_array1
        ass_array1=([name]="xxxx" [age]=18)
    
        echo  ${ass_array1[@]}
    
        echo ${ass_array1[name]}
    

    流程控制

    逻辑运算符

    数学比较运算符

    -eq 等于 equal
    -gt 大于 greater than
    -lt 小于 less than
    -ge 大于等于 greater equal
    -le 小于等于 less equal
    -ne 不等于 not equal
        test 检测文件类型或者比较运算
            test 1 -eq 1 ;echo $?;
        cut -d '.' -f1 以.切分
            echo "1.5*10"|bc|cut -d '.' -f1 #-f1为第一段
        bash -x debug模式
    

    文件比较检查

        # 判断文件夹是否存在。
        test -d /mnt/d/test;echo $?;
        # 判断文件或者目录是否存在
        test -e /mnt/d/test/first.sh
        -f #检测是否为文件且为文件
        -r 检测文件是否存在且可读
        -s 检测文件是否存在且不为空
        -w 检测文件是否存在且可写
        -x 检测文件是否存在且可读
        -o 检测文件是否存在且被当前用户拥有
        -G 检测文件是否存在且默认组为当前文件
        file1 -nt file2 检测file1是否比file2新
        file1 -ot file 检查file1是否比file2旧
    

    字符串比较运算

    == 等于
    != 不等于
    -n 检测字符串的长度是否大于0
    -z 检测字符串的长度是否为0
    

    逻辑运算符

    == != -n -z
    

    if

        if [ condition ]; then
        # body
        elif [ condition ]; then
        # body
        else
        # body
        fi
    
    if [];then
    fi
    

    if 高级

        if ((100%3+1>1));then
            echo "yes";
        else
            echo "no";
        fi
    
        #if [[$i == r*]] 判断$i变量值是否以r开头    [[]] 双中括号可以匹配字符串
        if [[ $USER == y* ]];then
        echo "11111"
        fi
    

    for 循环

        for ((i=0;i<100;i++)); do
        echo "$i"
        done
    
        for col in `docker images | awk '{ print $1":"$2 }'`; do
        echo "$col" | cut -d ':' -f 1
        echo "$col" | cut -d ':' -f 2
        done
    
        # 获得当前时间
        date +"%F %H:%M:%S"
    
        # for 依然支持continue break等。
    
    

    while

        #!/bin/bash
        function PingIP () {
        while [ $? -eq 0 ]; do
            ping -c1 192.168.10.100 &>/dev/null
            if [ $? -eq 0 ];then
            echo "`date +"%F %H:%M:%S"`: $1 is UP"
            else
            echo "`date +"%F %H:%M:%S"`: $1 is Down";
            fi
    
            sleep 1s
        done
        }
    
        PingIP "192.168.10.100"
    

    until 条件为假执行

        until [ condition ]; do
        # body
        done
    

    case 相当于switch

        case "$item" in
        1)
            echo "case 1"
        ;;
        2|3)
            echo "case 2 or 3"
        ;;
        *)
            echo "default"
        ;;
        esac
    

    shell 特殊变量

    特殊参数

    $*      表示所有参数,其间隔为IFS内定参数的第一个字元
    $@      与*号相同。不同之处在于不参照IFS
    $#      代表参数数量
    $       执行上一个指令的返回值
    $-      最近执行的foreground pipeline的选项参数
    $$      本身的Process ID
    $:      执行上一个背景指令的PID
    $_      显示出最后一个执行的命令
    $N      N是shell的第几个外传参数,比如N1是第一个参数
    

    方法

        注意:shell 的 function 是没有参数的,使用$1 表示第一个参数,$2 表示第二个参数,在调用这个 function 时, PingIP 第一个参数 第二个参数
        action "nginx start" $nginxd 
        killall 关闭线程 QUIT/HUB
    

    lsof 命令 lsof是系统管理/安全的管理工具。

    正则表达式

    grep、awk、sed 都支持正则表达式

  • 相关阅读:
    JavaScript 事件
    Docker 部署asp.netcore
    Docker 安装
    JavaScript 窗口操作
    JavaScript 定时器
    JavaScript Dom
    Javascript try catch es5标准模式
    JavaScript 数组去重
    JavaScript 返回具体类型方法
    mysql 触发器
  • 原文地址:https://www.cnblogs.com/yeqifeng2288/p/14461252.html
Copyright © 2020-2023  润新知