美文网首页
Shell这个语言好奇葩啊

Shell这个语言好奇葩啊

作者: 小米羊爱学术 | 来源:发表于2019-03-27 17:13 被阅读0次

    傲娇的赋值
    a = "apple" (wrong)
    a="apple" (right)
    

    奇怪的引号
    单引号内所有内容原样输出,双引号内可以有转义符和变量

    #!/bin/bash
    word=apple
    str='this is a ${word}'
    echo ${str}
    str="this is a ${word}"
    echo ${str}
    
    this is a ${word}
    this is a apple
    

    提取字符串时最后一个数字是字符串长度,而不是最后一个字符位置
    从字符串第 2 个字符(第一个字符位置为0)开始截取 4 个字符,输出 unoo

    string="runoob is a great site"
    echo ${string:1:4} 
    
    unoo
    

    摸不着头脑的操作符

    从左向右截取最后一个string后的字符串
    ${varible##*string}
    从左向右截取第一个string后的字符串
    ${varible#*string}
    从右向左截取最后一个string后的字符串
    ${varible%%string*}
    从右向左截取第一个string后的字符串
    ${varible%string*}
    

    不寻常的数组
    只有一维数组,且数组内容以空格分隔,而不是逗号
    读取整个数组时需要加[@]
    读取第n个位置到第m个位置的内容,不能用[n:m]或者[n,m]

    myarray=(v0 v1 v2 v3 v4 v5)
    echo ${myarray[1]}
    echo ${myarray[@]}
    echo ${myarray[@]:2:4}
    
    v1
    v0 v1 v2 v3 v4 v5
    v2 v3 v4 v5
    

    多此一举的字符位置
    左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示(直接用-1不好么)

    var="abcdefg"
    echo ${var:0-3}
    
    efg
    

    expr计算时,唯独*前要加转义符
    括号前也要加转义符

    val1=`expr 2 \* 2`
    echo ${val1}
    val2=`expr 2 * 2`
    echo ${val2}
    
     4
    
    expr: syntax error
    

    条件表达式也是离不开空格的戏精

    val1=`expr 2 \* 2`
    echo  $val1"
    val2=`expr 2 + 2`
    echo ${val2}
    if [ ${val1} == ${val2} ]
    then
    echo "right"
    fi
    

    数值比较大有玄机
    [ expression1 OP expression2 ],OP 可以为 -gt、-lt、-ge、-le、-eq、-ne
    ((expression1 OP expression2)),OP 可以为 >、<、>=、<=、==、!=

    字符串比较事多
    [ string1 OP string2 ],OP为==、!=、\>、\<

    布尔运算也要另辟蹊径

    运算符 说明 举例
    ! 非运算,表达式为 true 则返回 false,否则返回 true [ ! false ] 返回 true
    -o 或运算,有一个表达式为 true 则返回 true [ $a -lt 20 -o $b -gt 100 ] 返回 true
    -a 与运算,两个表达式都为 true 才返回 true [ $a -lt 20 -a $b -gt 100 ] 返回 false

    逻辑运算符也不是吃素的
    双中括号太厉害了

    运算符 说明 举例
    && 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
    || 逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true
    a=1
    b=10
    if [ $a != $b -a `expr $a + $b` == 11 ]
    then
    echo "hi"
    fi
    if [[ $a != $b && `expr $a + $b` == 11 ]]
    then
    echo "hi"
    fi
    

    都输出了hi,但是后者必须要[[]]
    判断字符串是否为0还是别用-n了吧
    -n 为true表示字符串长度不为0,但是这个引号你说多平白无故?

    if [ -z $a ]
    then
       echo "-z $a : 字符串长度为 0"
    else
       echo "-z $a : 字符串长度不为 0"
    fi
    if [ -n "$a" ]
    then
       echo "-n $a : 字符串长度不为 0"
    else
       echo "-n $a : 字符串长度为 0"
    fi
    

    条件语句if的结尾还要fi
    if [ condition ]; then command; elif command; fi
    for [ condition ]; do command; command; done
    while [condition]; do command; command; done
    until [condition]; do command; done

    相关文章

      网友评论

          本文标题:Shell这个语言好奇葩啊

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