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 都支持正则表达式

上一篇:2021-05-03


下一篇:NumPy数组