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

違いはパス名の展開にあります。~引用符を外すと、シェルはそれをホーム ディレクトリに展開します。ただし、引用符で囲まれている場合は、展開されません。例えば

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

次の 2 つの方法のいずれかでスクリプトを修正できます。

  1. 引用符を削除します: file=~/.todo/$1.task. このような変数の割り当ての場合、空白$1はコマンドを壊しませんが、必要に応じて引用することができます$1
  2. $HOME代わりに使用してください:file="$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 に答える