• shell笔记


    通配符

    • 没有 . (符号 . 只表示字符串的 . ,区别于正则表达式)
    • [Aa] 表示 A 或者 a
    • ? 表示任意字符
    • * 表示任意字符串

    IFS

    data='name, sex, rollno, location'
    oldIFS=$IFS
    IFS=', '
    for i in $data; do
        echo $i;
    done

    变量

    $*     表示输入参数的具体内容(将输入的参数作为一个单词)
    $@     表示输入参数的具体内容(将输入的参数作为一个列表对象),参数按 IFS 分割
    $?     表示上一个命令退出的状态
    $$     当前 shell 进程的 pid(即当前进程的编号)
    $!     后台运行的最后一个进程的 pid
    $0 表示当前脚本名称
    $n 表示位置变量(n代表数字,n>=1)
    $# 表示变量的个数,常用于循环

    长度

    var='xxxx'
    length=${#var}
    length=`echo -n $var | wc -m`
    word=`echo -n $var | wc -w`

    拼接

    s1='abc'
    s2='def'
    s3=`printf "%s%s" $s1 $s2`
    echo $s3

    变量默认值

    var=${var-'value'}     # 如果 var 没被声明, 就用 value

    子串

    a='abcd'
    echo ${a:0}              # abcd
    echo ${a:1}              # bcd
    echo ${a:1:2}            # bc

    子串表达式

    {$var#str}               # 从开头删除 str
    {$var##str}              # 从开头删除最长匹配的 str
    {$var%str}               # 从结尾删除 str
    {$var%%str}              # 从结尾删除最长匹配的 str
    
    dir=/etc/httpd/httpd.conf
    echo ${dir#/*/}          # httpd/httpd.conf
    echo ${dir##/*/}         # httpd.conf
    
    echo ${dir%/*/}          # 没有删除任何
    echo ${dir%/*}           # /etc/httpd
    echo ${dir%%/*}          # 全部被删除 为空

    字符串替换 (可以有正则表达式)

    str='abc 123 def abc'
    echo ${str/abc /def}     # def123 def abc
    echo ${str//abc/def}     # def 123 def def
    echo ${str//[0-9]/}      # abc def abc

    判断

    字符串

    [ $var == "xxx" ]
    [ $var != "xxx" ]
    [ -n STRING ]          # the length of STRING is nonzero
    [ -z STRING ]          # the length of STRING is zero

    数字

    [ $num -eq 10 ]
    [ $num -ne 10 ]
    [ $num -lt 10 ]
    [ $num -le 10 ]
    [ $num -gt 10 ]
    [ $num -ge 10 ]

    文件

    [ -d $FILE_NAME ]      # dir
    [ -e $FILE_NAME ]      # exist
    [ -f $FILE_NAME ]      # regular file
    [ -L $FILE_NAME ]      # symbol link
    [ -r $FILE_NAME ]
    [ -w $FILE_NAME ]
    [ -x $FILE_NAME ]
    [ -S $FILE_NAME ]      # socket
    [ -b $FILE_NAME ]      # block
    [ -c $FILE_NAME ]      # char

    RONDOM

    shell 的 $((RANDOM)) 会返回一个随机值

    if [ ${#} -eq 0 ]; then
        echo $((RANDOM))
    elif [ $1 == '--help' -o $1 == '-h' ]; then
        echo "usage: random num1, num2   [num1, num2)"
    elif [ ${#} -eq 1 ]; then
        echo $((RANDOM%$1))
    else
        echo $((RANDOM%(($2-$1))+$1))
    fi

    数学

    echo $((100 / 3))
    
    i=8
    echo $((i + 12))
    
    i=8
    let i=5+3             # '=' 两侧不允许有空格
    i=$((i+1))
    let i++

    控制流

    # if
    if [ xxx ]; then
        xxx
    elif [ xxx ]; then
        xxx
    else
        xxx
    fi
    
    
    if [ xxx ] && [ xxx ]; then
        xxx
    fi
    
    
    
    # while
    while [ xxx ]; do
        xxx
    done
    
    
    while read line; do
        echo $line;
    done < input.txt;
    
    
    
    # for
    for i in `seq 1 10`; do
        echo $i;
    done
    
    
    for x in one two three four; do
        echo number $x
    done
    
    
    
    # case
    x="start"
    case $x in
        start)
            echo 'start'
            ;;
        stop)
            echo "stop"
            ;;
        *)
            echo stop
            ;;
    esac
    
    
    x="restart"
    case $x in
        start|restart)
            echo 'start'
            ;;
        stop)
            echo "stop"
            ;;
        *)
            echo stop
            ;;
    esac

    函数

    myvar="hello"
    myfunc() {
        myvar="one two three"
        for x in $myvar; do
            echo $x
        done
    }
    myfunc                # 执行函数
    echo $myvar $x        # one two three  (说明变量是全局的)
    myvar="hello"
    myfunc() {
        local x
        local myvar="one two three"
        for x in $myvar; do
            echo $x
        done
    }
    myfunc
    echo $myvar $x         # hello  ($x 没有输出)
    repeat() {
        while true; do
            $@ && return
            sleep 5
        done
    }

    子 shell

    子 shell 就是 () 里面的内容,相当于重新开启一个 shell。这样做的好处是 子 shell 里面做的事情不会影响到当前的 shell,比如定义变量,cd 到别的路径..

    pwd;
    (cd /bin; ls);
    pwd;

    数组

    declare -A arr
    arr=([index1]='abc' [index2]='def')
    echo ${arr[index1]}
    echo ${arr['index1']}
    
    arr[index3]='xyz'
    echo ${arr[index3]}
    for i in ${arr[@]}; do
        echo $i;                    # abc def xyz
    done
    
    for i in ${!arr[@]}; do
        echo $i;                    # index1 index2 index3
    done

    获取命令参数

    while getopts xyz opt; do
        case $opt in
            x)
                echo 'x'
                ;;
            y)
                echo 'y'
                ;;
            z)
                echo 'z'
                ;;
            ?)
                echo 'invalid'
                ;;
        esac
    done
    ./run -xyz
    while getopts x:y:z: opt; do
        case $opt in
            x)
                echo 'x' $OPTARG
                ;;
            y)
                echo 'y' $OPTARG
                ;;
            z)
                echo 'z' $OPTARG
                ;;
            *)
                echo 'invalid'
                ;;
        esac
    done
    ./run -x abc -y def -z ghi
  • 相关阅读:
    Rediect to ...
    [VSTO] warning CS0467 解决方案
    [HTTP]Nonocast.http post方法
    2013年上半年读过的书-无责任书评
    Cordova deploy on Android
    First App on Phonegap | Cordova
    Windows store app[Part 4]:深入WinRT的异步机制
    Windows store app[Part 3]:认识WinRT的异步机制
    Windows store app[Part 2]:全新的File System与Uri不匹配的问题
    Windows store app[Part 1]:读取U盘数据
  • 原文地址:https://www.cnblogs.com/kdy11/p/8875532.html
Copyright © 2020-2023  润新知