美文网首页
shell 语法 干货

shell 语法 干货

作者: wangtieshan | 来源:发表于2017-10-09 22:36 被阅读0次

    if 条件语句

    if [ $1x == "ab"x ]; then
        echo "you had enter ab"
    elif [ $1x == "cd"x ]; then
        echo "you had enter cd"
    else
        echo "you had enter unexpected word"
    fi
    

    比较

    对比字符串只能使用==、<、>、!=、-z、-n。对比字符串时,末尾一定要加上x(或者a、b等)一个字符,因为if [ $1x == "ab"x ]时如果没有了x ,并且$1是"",这个语句会翻译成if [  == "ab" ],左边相当于没有东西了,会报语法错误。或者使用[[  ]],就不需要x了。使用<或者>时,如果是用[  ],需要用转义符"\",如\>。
    
        对比数字使用既能使用-eq、-ne、-gt、-ge、-lt、-le,也能使用==、<、>、!=。其中-eq的意思是equal,-ne是unequal,-gt是greater than,-ge是greater than or equal to,-lt是less than,-le是less than or equal to。
    

    [和[[的区别

       区别一。在[中使用逻辑运算符,需要使用-a(and)或者-o(or)。在[[中使用逻辑运算符,需要使用&&或者||。
    
       区别二。[是shell命令,在它包围的表达式是它的命令行参数,所以串比较符>和<需要转义,否则就变成io重定向了。[[是shell关键字,不会做命令行扩展,所以<和>不需要进行转义。但是语法相对严格,如在[中可以用引号括起操作付,[[则不行。如if [ "-z" "ab" ]。
    
       区别三。[[可以做算术扩展,[则不行。如if [[ 11+1 -eq 100 ]],而if [ 11+1 -eq 100 ]则会报错。
    

    FILE

    在高级语言中,判断文件是否存在等各种状态都是需要调用特定的函数进行判断。而在shell中,这方面就比较方便些,只需要运算符即可。
    
       常用的文件判断运算符如下:
    
    -e 文件是否存在
    
    -f  文件是否是普通文件(不是目录、设备文件、链接文件)
    
    -s  表示文件大小不为0
    
    -d 表示文件是否是目录
    
    -b 表示是块设备(光驱、软盘等)
    
    -c  表示是字符设备(键盘、声卡等)
    
    -p 表示是管道
    
    -h 表示是符号链接
    
    -S 表示是否是socket
    
    -r、-w、-x表示文件是否有可读、可写、可执行权限(指运行这个测试命令的用户)
    
    f1 -nt f2      f1是否比f2新(new than)
    
    f1 -ot f2      f1是否比f2旧(old than)
    
    f1 -ef f2      f1和f2是否是相同文件的硬链接
    
           使用!时表示上述结果取反,由于内容较多,这里不一一列举了。下面一个例子可以作为编程参考
    

    写入字符传到文件中

    echo something -> filename
    

    总结

    -e                          文件存在
    -a                          文件存在(已被弃用)
    -f                          被测文件是一个regular文件(正常文件,非目录或设备)
    -s                          文件长度不为0
    -d                          被测对象是目录
    -b                          被测对象是块设备
    -c                          被测对象是字符设备
    -p                          被测对象是管道
    -h                          被测文件是符号连接
    -L                          被测文件是符号连接
    -S(大写)                    被测文件是一个socket
    -t                          关联到一个终端设备的文件描述符。用来检测脚本的stdin[-t0]或[-t1]是一个终端
    -r                          文件具有读权限,针对运行脚本的用户
    -w                          文件具有写权限,针对运行脚本的用户
    -x                          文件具有执行权限,针对运行脚本的用户
    -u                          set-user-id(suid)标志到文件,即普通用户可以使用的root权限文件,通过chmod +s file实现
    -k                          设置粘贴位
    -O                          运行脚本的用户是文件的所有者
    -G                          文件的group-id和运行脚本的用户相同
    -N                          从文件最后被阅读到现在,是否被修改
    f1 -nt f2                   文件f1是否比f2新
    f1 -ot f2                   文件f1是否比f2旧
    f1 -ef f2                   文件f1和f2是否硬连接到同一个文件
    二元比较操作符,比较变量或比较数字
    整数比较:
    -eq                       等于            if [ "$a" -eq "$b" ]
    -ne                       不等于          if [ "$a" -ne "$b" ]
    -gt                       大于            if [ "$a" -gt "$b" ]
    -ge                       大于等于        if [ "$a" -ge "$b" ]
    -lt                       小于            if [ "$a" -lt "$b" ]
    -le                       小于等于        if [ "$a" -le "$b" ]
    <                         小于(需要双括号)           (( "$a" < "$b" ))
    <=                        小于等于(...)                (( "$a" <= "$b" ))
    >                         大于(...)                    (( "$a" > "$b" ))
    >=                        大于等于(...)                (( "$a" >= "$b" ))
    
    字符串比较:
    =                         等于           if [ "$a" = "$b" ]
    ==                        与=等价
    !=                        不等于         if [ "$a" = "$b" ]
    <                         小于,在ASCII字母中的顺序:
                              if [[ "$a" < "$b" ]]
                              if [ "$a" \< "$b" ]         #需要对<进行转义
    >                         大于
    -z                        字符串为null,即长度为0
    -n                        字符串不为null,即长度不为0
    

    显示当前路径

    pwd
    

    相关文章

      网友评论

          本文标题:shell 语法 干货

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