0

単純な質問ですが、どうやら私は自分で答えを見つけることができません。

ユーザーからの入力を読み取り、それを保存します$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

有効なファイルではないと言うたびに。助けてください。

4

3 に答える 3

2

他の人は、あなたのコードが非常にうまく失敗する理由を説明しています。私に残されているのはreadlink、可能な解決策を指摘することだけです:

readlink -e ~/company/files/database.sqlite

これにより、絶対(拡張)パスが得られます / $? == ファイルが存在する場合は 0、何もない / $? == 現在の作業ディレクトリに関係なく、そうでない場合は 1。

ただし、これreadlinkは GNU coreutils に属していることに注意してください。広く普及していますが (Linux、Cygwin など)、遍在しているわけではありません (AIX など)。

于 2013-04-17T11:32:41.070 に答える
1

フォームのファイルパスを入力していると仮定します~/.../foo.sqlite

Bash tilde-expansion は、パラメーター展開がある場所では呼び出されません。マンページから(少なくとも、このコピー):

単語が引用符で囲まれていないチルダ文字 ('~') で始まる場合、最初の引用符で囲まれていないスラッシュの前のすべての文字 (引用符で囲まれていないスラッシュがない場合はすべての文字) がチルダ接頭辞と見なされます。チルダ接頭辞の文字が引用符で囲まれていない場合、チルダに続くチルド接頭辞の文字は、可能なログイン名として扱われます。このログイン名がヌル文字列の場合、チルダはシェル パラメータ HOME の値に置き換えられます。HOME が設定されていない場合、シェルを実行しているユーザーのホーム ディレクトリが代わりに使用されます。それ以外の場合、チルダ接頭辞は、指定されたログイン名に関連付けられたホーム ディレクトリに置き換えられます。

[...]

各変数の割り当ては、: または最初の = の直後に引用符で囲まれていないチルダ接頭辞がないかチェックされます。これらの場合、チルダ展開も実行されます。したがって、PATH、MAILPATH、および CDPATH への割り当てでチルダ付きのファイル名を使用することができ、シェルは展開された値を割り当てます。

read database_pathはチルダを展開しません[ -f "$database_path" ]。したがって、コマンドはではなく[を探します。$PWD/~/...$HOME/...

これは、絶対パス (で始まる/) または現在のディレクトリからの相対パスを使用して修正できます。

(警告:現在、私は Bash を持っていないため、これはテストされていません。編集: 横たわっていた MinGW Bash (3.1.17(1)-release) でテストしました。理論は確認済みです。)

于 2013-04-17T10:36:10.907 に答える
1

@ michaelb958が述べたように; 発生しているエラーは~、$HOME に展開されていないことが原因です。2つの可能な解決策があります

1)を引用符なしで展開するように変更[ -f "$database_path" ]します。[ -f $database_path ]~

2)@ michaelb958が言及したように; 絶対に引用符が必要な場合は、現在のディレクトリからの絶対パスまたは相対パスを指定できます$database_path

于 2013-04-17T11:23:03.143 に答える