检查路径是否导致文件

时间:2013-04-17 10:12:06

标签: bash file

简单的问题,但显然我自己无法找到答案。

我读取了用户的输入并将其保存到$database_path

从那里我看到变量是否已设置。如果它不是我退出,那么检查路径是否通向文件。以下是我的代码..

read database_path

echo "database path = $database_path"

if [ -z $database_path ]; then
    echo "Error: You must enter a path to the database"
    exit
elif [ ! -f "$database_path" ]
then
    echo "Error: Path \"$database_path\" does not lead to a file"
    exit
fi

即使我输入了一个有效的数据库路径,它也不会检测到它的有效文件(我已经替换了名称等等)。

~/company/files/database.sqlite

每次它只是说它不是一个有效的文件。请帮忙。

3 个答案:

答案 0 :(得分:2)

其他人已经解释了为什么你的代码失败了。留给我的只是指向readlink寻找可能的解决方案:

readlink -e ~/company/files/database.sqlite

这会给你绝对(扩展)路径/ $? == 0如果文件存在,没有/ $?如果不是,则== 1,无论您当前的工作目录如何。

但请记住,readlink属于GNU coreutils;虽然普遍存在(例如Linux,Cygwin)但它并不是无处不在(例如AIX)。

答案 1 :(得分:1)

假设您输入的格式为~/.../foo.sqlite

的文件路径

在参数扩展的任何地方都不会调用Bash tilde-expansion。从联机帮助页(至少this copy):

  

如果一个单词以不带引号的波形符('〜')开头,则第一个不带引号的斜杠之前的所有字符(或所有字符,如果没有未加引号的斜杠)都被视为波浪号前缀。如果没有引用tilde-prefix中的任何字符,则代字号后面的波浪号前缀中的字符将被视为可能的登录名。如果此登录名是空字符串,则将波形符替换为shell参数HOME的值。如果未设置HOME,则替换执行shell的用户的主目录。否则,tilde-prefix将替换为与指定登录名关联的主目录。

     

[...]

     

检查每个变量赋值是否紧跟在:或第一个=之后的未加引号的波浪号前缀。在这些情况下,还执行波浪扩展。因此,可以在PATH,MAILPATH和CDPATH的赋值中使用带有波浪号的文件名,并且shell会分配扩展值。

read database_path不会扩展代字号,也不会扩展代码[ -f "$database_path" ]。因此,[命令将查找$PWD/~/...,而不是$HOME/...

这可以通过使用绝对路径(以/开头)或相对于当前目录的路径来修复。

警告:我现在没有Bash,所以这是未经测试编辑:我测试了它MinGW Bash(3.1.17(1)-release)我躺在身边;理论确认。)

答案 2 :(得分:1)

正如@ michaelb958所说;您得到的错误是由于~没有扩展到$ HOME。有两种可能的解决方案

1)将[ -f "$database_path" ]更改为[ -f $database_path ],以便~不加引号并将展开。

2)正如@ michaelb958所提到的那样;如果您必须绝对需要$database_path周围的引号,则可以提供相对于当前目录的完整路径或路径。