测试文件存在bash

Set*_*hot 1 unix bash

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

file="~/.todo/$1.task"
if [ ! -f "$file" ]; then
    echo "Error. Task ~/.todo/$1.task not found."
    ls ~/.todo/
    exit 1
fi
Run Code Online (Sandbox Code Playgroud)

当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
Run Code Online (Sandbox Code Playgroud)

为什么它真的不存在呢?我试过-e和-f标志虽然我不完全理解其中的区别.

Kev*_*vin 7

不同之处在于路径名扩展.如果没有~引用,shell会将其扩展到您的主目录.但是当它在引号内时,就像你拥有它一样,它不会被扩展.例如

$ file="~"; echo $file
~
$ file=~; echo $file
/Users/kevin
Run Code Online (Sandbox Code Playgroud)

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

  1. 删掉引号:file=~/.todo/$1.task.在像这样的变量赋值的情况下,空格$1不会破坏命令,但是你可以只引用$1你想要的.
  2. $HOME改为使用:file="$HOME/.todo/$1.task"