美文网首页
Shell编程

Shell编程

作者: 攻城老狮 | 来源:发表于2021-04-08 21:31 被阅读0次

    一 基本语法

    1 变量

    变量分为环境变量本地变量

    • 定义变量
    VAR=hello # 等号两侧没有空格
    echo $VAR # 获取变量值
    
    • 声明为环境变量
    export VAR # 将本地变量声明为环境变量
    env | grep $VAR # 从 env 中获取 VAR 变量
    
    • 删除变量
    unset VAR
    

    2 命令代换

    # 输出date命令
    DATE=`date` # or  DATE=$(date)
    echo $DATE
    

    3 算数代换

    echo $[10+20] # 30
    echo $[2#10+11] # 13 二进制的10 和 十进制的11 相加
    
    VAR=45
    echo $[$VAR+10] # 55 or echo $[VAR+10]  or echo $((VAR+10)) or echo $(($VAR+10))
    

    4 转义字符

    touch \$\ \$file
    
    touch -- -abc
    rm -- -abc
    
    touch ./--abc
    rm ./--abc
    

    5 单双引号

    VAR=`date` 
    echo "$VAR" # 2021年 04月 07日 星期三 22:54:48 CST
    echo '$VAR' # $VAR
    

    二 Shell 脚本语法

    1 条件测试

    注:判断变量时候最好带上双引号

    # 整数或者取值为整数的变量:-eq(等于) -ne(不等于) -lt(小于) -le(小于等于) -gt(大于) -ge(大于等于)
    VAR=50
    test $VAR -eq 50
    echo $? # 0
    test $VAR -ne 50
    echo $? # 1
    test $VAR -gt 30
    echo $? # 0
    [ $VAR -lt 10 ] # 等价于 test $VAR -lt 10
    echo $? # 1
    
    # 目录,文件-d(目录) -f(普通文件) 
    [ -d testdir ]
    echo $? # 0
    [ -f testfile ]
    echo $? # 0
    
    # 字符串或者取值为字符串的变量 -z(字符串长度为零) -n(字符串长度非零) =(相等) !=(不相等)
    VAR=hello
    [ -z $VAR ]
    echo $? # 1
    [ -n $VAR ]
    echo $? # 0
    
    VAR= # 空值
    [ -n $VAR ]
    echo $? # 0
    [ -n "$VAR" ] # 判断变量时候最好带上双引号,防止出错
    echo $? # 1
    
    VAR1=hello
    VAR2=hello
    [ $VAR1 = $VAR2 ] # 判断变量时候最好带上双引号,防止出错
    echo $? # 0
    [ $VAR1 != $VAR2 ]
    echo $? # 1
    
    # 与或非 -a(与) -o(或) !(非)
    VAR=hello
    [ -d testdir -a "$VAR" = "hello" ]
    echo $? # 0
    

    2 分支

    • if 语句(模糊匹配)
    #! /bin/bash
    # 判断传入的是文件还是目录
    echo "please enter the test content: "
    read content # 读取输入
    if [ -d "$content" ]; then
        echo "it is dir"
    elif [ -f "$content" ]; then
        echo "it is file"
    else
        echo "unkown"
    fi
    
    • case 语句(精准匹配)
    #! /bin/bash
    # 判断传入的是yes或no
    echo "please enter your choice(yes/no): "
    read BUF
    case "$BUF" in
        yes|y|Y|Yes)
            echo "yes!"
            ;;
        [nN]?)
            echo "no!"
            ;;
        *)
            echo "unkonwn"
            ;;
    esac
    

    3 循环

    • for循环
    #! /bin/bash
    # 判断ls列举的内容是目录还是文件类型
    for MYFILE in `ls`; do
        
        if [ -d "$MYFILE" ]; then
            echo "$MYFILE is a dir"
        elif [ -f ""$MYFILE ]; then
            echo "$MYFILE is a file"
        else
            echo "$MYFILE is others"
        fi  
    
    done
    
    • while 循环
    #! /bin/bash
    # 判断输入的密码是否正确,并且有尝试的次数限制
    COUNT=2
    echo "enter your password: "
    read PWD
    while [ "$PWD" != "yorick" -a $COUNT -gt 0 ]; do
        echo "you have only $COUNT times,try again: "
        read PWD
        COUNT=$[COUNT-1]
    done
    
    if [ $COUNT -eq 0 ]; then
        echo "fault"
        exit 1
    fi
    
    echo "success"
    

    4 位置参数和特殊变量

    #! /bin/bash
    echo $0 # argv[0]
    echo $1 # argv[1]
    echo $2 # argv[2]
    echo $3 # argv[3]
    
    shift # 参数左移
    shift
    echo $0
    echo $1
    echo $2
    echo $3
    
    echo $@ # 显示参数列表 argv[1] argv[2] ...
    echo $# # 参数个数 argc-1
    echo $$ # 当前进程号
    
    # 测试
    ./t5.sh aa bb cc dd ee ff
    # result
    ./t5.sh
    aa
    bb
    cc
    ./t5.sh
    cc
    dd
    ee
    cc dd ee ff
    4
    56334
    

    5 输入输出

    • echo
    -e 解析转义字符
    -n 不回车换行,默认情况echo回显的内容后面跟一个回车换行
    
    • tee
    # 把结果输出到标准输出的同时,另一个副本输出到相应文件
    ls -l | tee out # 即输出到屏幕,又复制到out文件
    
    • 文件重定向
    cmd > file # 标准输出重定向到file
    cmd >> file # 追加file
    cmd > file 2>&1 # 标准出错也重定向到file
    cmd >> file 2>&1 
    cmd < file1 > file2 # 把file1输入到标准输出,再重定向到file2
    

    6 函数

    #! /bin/bash
    # 判断目录是否存在,不存在则创建
    is_dir()
    {
        DIR_NAME=$1
        if [ ! -d "$DIR_NAME" ]; then
            return 1
        else
            return 0
        fi
    }
    
    for DIR in "$@";do
        if is_dir "$DIR";then
            :
        else
            echo "$DIR doesn't exist,creating it now..."
            mkdir $DIR > /dev/null 2>&1
            if [ $? -ne 0 ]; then
                echo "cannot create directory $DIR"
                exit 1
            fi
        fi
    done
    

    7 调试

    #! /bin/bash -x 
    # 调试
    is_dir()
    {
        DIR_NAME=$1
        if [ ! -d "$DIR_NAME" ]; then
            return 1
        else
            return 0
        fi
    }
    
    for DIR in "$@";do
        set -x # 调试
        if is_dir "$DIR";then
            :
        else
            echo "$DIR doesn't exist,creating it now..."
            mkdir $DIR > /dev/null 2>&1
            if [ $? -ne 0 ]; then
                echo "cannot create directory $DIR"
                exit 1
            fi
        fi
        set +x # 调试
    done
    

    三 正则表达式

    1 字符类

    image-20210408160140494.png

    2 数量限定符

    image-20210408161058778.png

    3 位置限定符

    image-20210408161130066.png

    4 其他特殊字符

    image-20210408162036080.png
    # egrep "正则" 文件
    # or grep -E "正则" 文件
    egrep "^([0-9]{1,3}\.){3}[0-9]{1,3}$" regexDemo 
    

    相关文章

      网友评论

          本文标题:Shell编程

          本文链接:https://www.haomeiwen.com/subject/lyfbkltx.html