关于shell:-d条件表达式的奇怪行为

Strange behaviour of -d conditional expression

我的kornshell(ksh)手册说,如果文件存在并且是一个目录,那么-d表达式将返回true。因此,如果file是一个目录,那么if [[ -d file ]]应该返回true。但在我的情况下,这不是它的工作原理。如果文件存在且不是目录,则返回true,但Shell手册中说"它是目录"。那么,有人知道为什么它的工作与它应该是什么相反吗?


它工作得很好,你的期望是错误的。在shell中,0返回值为true,而非零返回值为false。

1
2
3
4
$ true ; echo $?
0
$ false ; echo $?
1


ksh文件操作员如果:

  • -存在文件
  • -文件是一个目录
  • -f文件是常规文件(即,不是目录或其他特殊类型的文件)
  • -r您对文件具有读取权限
  • -S文件存在且不为空
  • -W您对文件具有写权限
  • -x您对文件具有执行权限,如果是目录,则具有目录搜索权限。
  • -o归档您自己的文件
  • -G文件您的组ID与文件的组ID相同

ksh文件操作员功能.ksh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#***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,学习Kornhell第1卷