测试文件存在bash

时间:2013-03-09 21:34:46

标签: bash unix

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

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 个答案:

答案 0 :(得分:7)

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

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

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

  1. 删除引号:file=~/.todo/$1.task。对于像这样的变量赋值,$1中的空格不会破坏命令,但如果需要,可以引用$1
  2. 改为使用$HOMEfile="$HOME/.todo/$1.task"

答案 1 :(得分:1)

当你检查"$file"时,我不认为代字号扩展正在发生。所以文件名 它正在寻找仍然具有波浪形的角色,而不是扩展到 主目录。

答案 2 :(得分:0)

在Bash中,您可以执行以下操作:

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

这应将〜替换为$ HOME

答案 3 :(得分:-4)

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