我正在做一个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测试或使用其他语言或使用相对路径执行脚本但不是〜/。
有人知道我错过了什么?
谢谢。
答案 0 :(得分:1)
您应该更正您的脚本以使用某个参数(例如$1
)而不是read
- 然后运行
checkDirectory ~
或
checkDirectory $HOME
您的shell需要~
为globbed。您可以在脚本中执行globbing(例如,如果您坚持eval
- 变量,则使用read
;阅读glob(7)
谨防恶意code injections(例如,用户输入foo; rm -rf $HOME
)
答案 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
将命令的输出传递给文件>
。