简单的问题,但显然我自己无法找到答案。
我读取了用户的输入并将其保存到$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
每次它只是说它不是一个有效的文件。请帮忙。
答案 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
周围的引号,则可以提供相对于当前目录的完整路径或路径。