如果测试-d没有找到〜/目录

时间:2015-02-03 08:32:05

标签: bash shell

我正在做一个script.sh,我必须知道目录是否存在。但是,当我尝试访问检查我的文件夹文档(在我的主目录中)如果我使用相对路径〜/ Documents它没有工作。这是我的代码:

function checkDirectory {
    read directory
    if test -d $directory
        then
            echo "exists"
        else echo "doesn't exists"
    fi
 }
 checkDirectory

我已尝试使用if -d $目录和test -d" $ directory"。我还尝试将我的工作目录改为" /"。

有趣的是,当我使用相对路径作为../它有效!而且,什么是更奇怪的,相同的代码写在shell上而不是通过执行 我的脚本文件也可以。

我在Mac和Ubuntu上检查过这个。

我一直在寻找答案,但我发现的只是在shell上执行if测试或使用其他语言或使用相对路径执行脚本但不是〜/。

有人知道我错过了什么?

谢谢。

3 个答案:

答案 0 :(得分:1)

您应该更正您的脚本以使用某个参数(例如$1)而不是read - 然后运行

 checkDirectory ~

 checkDirectory $HOME

您的shell需要~globbed。您可以在脚本中执行globbing(例如,如果您坚持eval - 变量,则使用read;阅读glob(7)

谨防恶意code injections(例如,用户输入foo; rm -rf $HOME

阅读advanced bash scripting guide

答案 1 :(得分:0)

问题是test -d无法理解代字号~。对于解决方法,您可以这样做:

[STEP 101] # read dir
~/tmp
[STEP 102] # eval "dir=$dir"
[STEP 103] # test -d "$dir" && echo yes
yes
[STEP 104] #

答案 2 :(得分:0)

您需要使用~来评估read eval命令的读取内容,如下所示:

function checkDirectory {
    read directory
    if test -d "`eval echo ${directory//>}`"
        then
            echo "exists"
        else echo "doesn't exists"
    fi
 }
 checkDirectory

您可能会注意到代码中有一个额外的//>,用于转义任何空格并在命令中输出重定向>而不是事先执行。

修改

回答你的评论:

如果要将输入重定向到某个文件,例如:

checkDirectory.sh
>>  ~/directory name/path/ > file1.txt

此处您的目录名称directory name中有一个空格。并且您使用重定向运算符file1.txt将命令的输出传递给文件>