-d条件表达式的奇怪行为

时间:2013-06-18 12:29:40

标签: shell unix scripting ksh

My KornShell(ksh)手册说如果文件存在且-d表达式是目录,则if [[ -d file ]]表达式返回true。 因此,如果file是目录,{{1}}应该返回TRUE。但就我而言,这不是它的工作原理。如果文件存在并且不是目录,则返回TRUE,但是shell的手册说“它是一个目录”。那么,是否有人知道它为什么与它应该是相反的工作?

2 个答案:

答案 0 :(得分:3)

工作正常;你的期望是错的。在shell中, 0 返回值为 true 非零返回值为 false

$ true ; echo $?
0
$ false ; echo $?
1

答案 1 :(得分:0)

ksh文件操作员|如果符合以下情况属实:

  • -a |文件存在
  • -d |文件是目录
  • -f | file是常规文件(即,不是目录或其他特殊类型的文件)
  • -r |您已获得文件
  • 的读取权限
  • -s |文件存在且不为空
  • -w |您拥有文件的写入权限
  • -x |您对文件具有执行权限,如果是目录,则具有目录搜索权限
  • -O | file您拥有的文件
  • -G | file您的组ID与文件
  • 的组ID相同

<强> kshFileOperatorsFunction.ksh

#***Function to demo ksh file Operators.***#
fileOperators(){
    echo "Entering fileOperators function."
    if [[ ! -a $1 ]]; then
        print "file $1 does not exist."
        return 1
    fi
    if [[ -d $1 ]]; then
        print -n "$1 is a directory that you may "
        if [[ ! -x $1 ]]; then
            print -n "not "
        fi
        print "search."
    elif [[ -f $1 ]]; then
         print "$1 is a regular file."
    else
         print "$1 is a special type of file."
    fi
    if [[ -O $1 ]]; then
        print 'you own the file.'
    else
        print 'you do not own the file.'
    fi
    if [[ -r $1 ]]; then
        print 'you have read permission on the file.'
    fi
    if [[ -w $1 ]]; then
        print 'you have write permission on the file.'
    fi
    if [[ -x $1 && ! -d $1 ]]; then
        print 'you have execute permission on the file.'
    fi
    echo "Exiting fileOperators function."
}

参考:O'Reilly, Learning the KornShell Volume 1