检查传递的参数是否是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,即使它们包含空格。
还值得一试: -e
testingpath是否存在,而不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