![ファイル チェック スクリプトの何が問題なのでしょうか?](https://rvso.com/image/76407/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%20%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%20%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%AE%E4%BD%95%E3%81%8C%E5%95%8F%E9%A1%8C%E3%81%AA%E3%81%AE%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B%3F.png)
ファイルまたはディレクトリが見つからない場合に、スクリプトの最後の部分に何も表示されないのはなぜかわかりません。
echo -n "Please enter a filename or directory: "
read filename
if [ -z "$filename" ]; then
echo "You did not enter anything!"
exit 1
fi
if [ -e "$filename" ]; then
if [ -f "$filename" ]; then
echo "You entered a file."
elif [ -d "$filename" ]; then
echo "You entered a directory."
else
echo "You did not enter a valid file or directory."
fi
fi
exit
コードのどこが間違っているのか分かりません。無効または存在しないファイルやディレクトリが入力された場合は、エコーが表示されません。
答え1
スクリプトを再フォーマットして、ステートメントをインデントしました。これにより、最後の がtrue で がfalse の場合にのみ発生するif
ことが明確になりました。ユーザーが存在しないファイルまたはディレクトリを入力した場合は、失敗します。echo
-f
-d
-f
最後のセクションに対する次の修正を検討してください。
if [ -e "$filename" ]; then
if [ -f "$filename" ]; then
echo "You entered a file."
elif [ -d "$filename" ]; then
echo "You entered a directory."
fi
else
echo "You did not enter a valid file or directory."
fi
最初のステートメントの true セクションif
が以前に終了している場合 ( によってelse
)、存在しないファイル/ディレクトリには実行するコードのセクションがあります。
答え2
このコードでは出力が生成されないファイルの種類は他にも多数あります。これには、シンボリック リンク、名前付きパイプ、ソケット、ブロック特殊ファイルと文字特殊ファイルが含まれます。特に、、、/dev/tty
は/dev/stdin
コードによって検出されず/dev/stdout
に/dev/stderr
フォールスルーします。
これを考慮してロジックを変更することもできますが、この構造 (case ステートメント スタイルの構造) の方が読みやすく、エラーも発生しにくくなります。
if [ ! -e "$filename" ]; then
echo "$filename does not exist"
exit 1
elif [ -f "$filename" ]; then
echo "You entered a file."
elif [ -d "$filename" ]; then
echo "You entered a directory."
else
echo "$filename is not a regular file or directory."
exit 2
fi