1

我已经阅读了其他一些问题,我觉得我和其他人完全一样,但我就是找不到文件。

file="~/.todo/$1.task"
if [ ! -f "$file" ]; then
    echo "Error. Task ~/.todo/$1.task not found."
    ls ~/.todo/
    exit 1
fi

当 del 被调用时,这是在函数内部......所以使用这个命令,输出如下:

$ ./todo.sh del 19
Error. ~/.todo/19.task not found.
10.task  13.task  16.task  1.task  6.task  9.task     tododatesorted
11.task  14.task  18.task  3.task  7.task  taskno
12.task  15.task  19.task  4.task  8.task  tododates

为什么它说它不存在,而实际上它存在?我试过 -e 和 -f 标志,虽然我不完全理解它们的区别。

4

4 回答 4

7

不同之处在于路径名扩展。当您~取消引用时,shell 会将其扩展至您的主目录。但是,当它在引号内时,正如您所拥有的那样,它不会被扩展。例如

$ file="~"; echo $file
~
$ file=~; echo $file
/Users/kevin

您可以通过以下两种方式之一修复您的脚本:

  1. 去掉引号:file=~/.todo/$1.task. 在像这样的变量赋值的情况下,空格$1不会破坏命令,但$1如果你愿意,你可以引用。
  2. 改用$HOMEfile="$HOME/.todo/$1.task"
于 2013-03-09T21:46:20.753 回答
1

当您检查"$file". 所以它正在寻找的文件名仍然包含波浪号,而不是扩展到主目录。

于 2013-03-09T21:43:52.157 回答
0

在 Bash 中,您可以这样做:

unexpanded_file="~/example.txt"
file="${unexpanded_file/#\~/$HOME}"

这应该用 $HOME 替换 ~

于 2019-07-16T12:19:52.773 回答
-4

尝试摆脱';' 在]之后...我不确定,我不能尝试。

于 2013-03-09T21:44:45.620 回答