检查传入的参数是否是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?