在Bash中检查传递的参数是否为文件或目录

43 浏览
0 Comments

在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日
0
0 Comments

至少写出没有多余冗长的代码:

#!/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 的看法。

0
0 Comments

应该可以工作。我不确定为什么它失败了。你正确引用了你的变量。如果你用双重方括号[[ ]]使用这个脚本会发生什么?

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来测试路径是否存在而不测试它是什么类型的文件。

0