在Bash中检查传递的参数是否为文件或目录
在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
所有这些路径都是有效的,也存在。
admin 更改状态以发布 2023年5月21日
至少写出没有多余冗长的代码:
#!/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 -ld "${PASSED}"
这将显示您传递给脚本的名称的 ls
的看法。