检查传入的参数是否是Bash中的文件或目录

我试图在Ubuntu中编写一个非常简单的脚本,它允许我将它传递给文件名或目录,并且能够在文件时执行某些特定操作,而当它是目录时则可以执行其他操作。 我遇到的问题是当目录名称或文件太多时,名称中包含空格或其他易变字符。

下面是我的基本代码,以及一些测试。

#!/bin/bash

PASSED=$1

if [ -d "${PASSED}" ] ; then
    echo "$PASSED is a directory";
else
    if [ -f "${PASSED}" ]; then
        echo "${PASSED} is a file";
    else
        echo "${PASSED} is not valid";
        exit 1
    fi
fi

这里是输出:

andy@server~ $ ./scripts/testmove.sh /home/andy/
/home/andy/ is a directory

andy@server~ $ ./scripts/testmove.sh /home/andy/blah.txt
/home/andy/blah.txt is a file

andy@server~ $ ./scripts/testmove.sh /home/andy/blah with a space.txt
/home/andy/blah with a space.txt is not valid

andy@server~ $ ./scripts/testmove.sh /home/andy with a space/
/home/andy with a space/ is not valid

所有这些路径都是有效的,并且存在。


这应该工作。 我不确定它为什么失败。 你正确地引用你的变量。 如果您使用double [[ ]]使用此脚本,会发生什么情况?

if [[ -d $PASSED ]]; then
    echo "$PASSED is a directory"
elif [[ -f $PASSED ]]; then
    echo "$PASSED is a file"
else
    echo "$PASSED is not valid"
    exit 1
fi

双方括号是[ ]的bash扩展名。 它不需要引用变量,即使它们包含空格。

还值得一试: -e测试路径是否存在,而不测试它是什么类型的文件。


至少在没有树木的情况下编写代码:

#!/bin/bash

PASSED=$1

if   [ -d "${PASSED}" ]
then echo "${PASSED} is a directory";
elif [ -f "${PASSED}" ]
then echo "${PASSED} is a file";
else echo "${PASSED} is not valid";
     exit 1
fi

当我把它写入一个“xx.sh”文件并创建一个文件“xx sh”并运行它时,我得到:

$ cp /dev/null "xx sh"
$ for file in . xx*; do sh "$file"; done
. is a directory
xx sh is a file
xx.sh is a file
$

鉴于您遇到问题,您应该添加以下内容来调试脚本:

ls -l "${PASSED}"

这将告诉你什么是ls想着你通过脚本的名称。


/bin/test上使用-f-d开关:

F_NAME="${1}"

if test -f "${F_NAME}"
then                                   
   echo "${F_NAME} is a file"
elif test -d "${F_NAME}"
then
   echo "${F_NAME} is a directory"
else                                   
   echo "${F_NAME} is not valid"
fi
链接地址: http://www.djcxy.com/p/97113.html

上一篇: Check if passed argument is file or directory in Bash

下一篇: Why do you need to put #!/bin/bash at the beginning of a script file?