检查传递的参数是否是BASH中的文件或目录

我试图在Ubuntu中编写一个非常简单的脚本,它允许我传递一个文件名或一个目录,并且能够在某个文件时做某些特定的事情,而当它是一个目录时则可以做某些事情。 我遇到的问题是当目录名称,或者可能是文件,名称中有空格或其他易变的字符。

下面是我的基本代码,以及几个testing。

#!/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 

所有这些path都是有效的,并存在。

这应该工作。 我不知道为什么它失败。 你正确地引用你的variables。 如果使用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扩展名。 它不需要引用variables,即使它们包含空格。

还值得一试: -etestingpath是否存在,而不testing它是什么types的文件。

至less编写没有树木的代码:

 #!/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”中并创build一个文件“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 $ 

鉴于你有问题,也许你应该通过添加一行来debugging脚本:

 ls -l "${PASSED}" 

这将告诉你什么我们认为你通过脚本的名字。

/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 

更新:我是downvoted所以我决定重新写我的答案,感谢您的反馈。

使用“file”命令可能对此有用:

 #!/bin/bash check_file(){ if [ -z "${1}" ] ;then echo "Please input something" return; fi f="${1}" result="$(file $f)" if [[ $result == *"cannot open"* ]] ;then echo "NO FILE FOUND ($result) "; elif [[ $result == *"directory"* ]] ;then echo "DIRECTORY FOUND ($result) "; else echo "FILE FOUND ($result) "; fi } check_file ${1} 

输出示例:

 $ ./f.bash login DIRECTORY FOUND (login: directory) $ ./f.bash ldasdas NO FILE FOUND (ldasdas: cannot open `ldasdas' (No such file or directory)) $ ./f.bash evil.php FILE FOUND (evil.php: PHP script, ASCII text) 

仅供参考:以上答案正常,但您可以通过首先检查有效文件来使用-s来帮助解决奇怪的情况:

 #!/bin/bash check_file(){ local file="${1}" [[ -s "${file}" ]] || { echo "is not valid"; return; } [[ -d "${file}" ]] && { echo "is a directory"; return; } [[ -f "${file}" ]] && { echo "is a file"; return; } } check_file ${1} 
 #!/bin/bash echo "Please Enter a file name :" read filename if test -f $filename then echo "this is a file" else echo "this is not a file" fi