Bashスクリプト“ [!:見つかりません”エラー、およびorステートメントの書き方
-
10-07-2019 - |
質問
編集: 更新されたコードは次のとおりです。
#!/bin/sh
files=`ls`
if [ $# -ne 1 -o -f $1 ]
then
echo "Usage: #!/bin/sh
files=`ls`
if [ $# -ne 1 ]
then
echo "Usage: <*> <directory>"
exit 1
fi
if [ ! -e $1 ]
then
echo "$1 not found"
exit 1
elif [ -d $1 ]
then
cd $1
for f in $files
do
if [! -d $f]
then
if [ ! -s $f ]
then
rm-r $f
echo "File: $f was removed."
else
continue
fi
fi
done
echo "Name\t\tLinks\t\tOwner\t\tDate"
for f in $files
do
find $f -type f -printf "%f\t\t %n\t\t %u\t %TH %Tb %TY\n"
done
exit 0
fi
<directory>"
exit 1
fi
if [ ! -e $1 ]
then
echo "$1 not found"
exit 1
elif [ -d $1 ]
then
cd $1
for f in $files
do
if [ ! -d "$f" ]
then
if [ ! -s "$f" ]
then
rm -r "$f"
echo "File: $f was removed."
else
continue
fi
fi
done
echo "Name\t\tLinks\t\tOwner\t\tDate"
for f in $files
do
find "$f" -type f -printf "%f\t\t %n\t\t %u\t %TH %Tb %TY\n"
done
exit 0
fi
間隔の問題をすべて修正し、#!bin / shを#/ bin / bashに変更し、&quot; $ f&quot;に引用符を追加しました。ただし、まだ多くのエラーが発生しています。
ava @ kosh:〜/ test $ ./delDir d1 rm:
d1 'を削除できません:そのようなファイルはありません ディレクトリファイル:d1は削除されました。 rm: 削除できません
delDir ':そのようなファイルはありません またはディレクトリファイル:delDirが削除されました。 rm:delDir2 'を削除できません:いいえ ファイルまたはディレクトリファイル:delDir2 削除されました。 rm:削除できません
e1 ':いいえ そのようなファイルまたはディレクトリファイル:e1は 削除されました。 rm:e2 'を削除できません:いいえ そのようなファイルまたはディレクトリファイル:e2は 削除されました。 rm:削除できません
make_d1 ': そのようなファイルまたはディレクトリはありませんファイル: make_d1は削除されました。 Name \ t \ tLinks \ t \ tOwner \ t \ tDate find: d1:そのようなファイルまたはディレクトリが見つかりません: delDir:そのようなファイルまたはディレクトリはありません find:delDir2:そのようなファイルがないか、 ディレクトリ検索:e1:そのようなファイルがないか、 ディレクトリ検索:e2:そのようなファイルはありませんまたは ディレクトリ検索:make_d1:そのようなファイルはありません またはディレクトリne1 2
ava 2009年11月22日ne2
2 ava 2009年11月22日
他に私が間違っていることを誰か知っていますか?
ここに私のコードがあります:<*>ここに私の質問があります:
通常のファイルではないものでスクリプトを実行した場合 そして、私はそれがしたいディレクトリではありません 「使用法:ファイル名ディレクトリ」と言います; (見る 行5)。私はこれを2でできることを知っています ifステートメントですが、それは可能ですか このためのORステートメントを作成します bash?
スクリプトを実行すると、次のようなエラーが表示されます:
./ delDir:39:[!:見つかりません./delDir:39:[!:見つかりません./delDir: 39:[!:見つかりません./delDir:39:[!: 見つかりません./delDir:39:[!:見つかりません ./delDir:39:[!:見つかりません./delDir: 39:[!:見つかりません./delDir:39:[!: 見つかりません./delDir:39:[!:見つかりません ./delDir:39:[!:名前が見つかりません
リンク所有者の日付 find:d1:そのようなファイルまたはディレクトリはありません find:delDir:そのようなファイルはありません ディレクトリ検索:delDir2:そのようなファイルはありません またはディレクトリe1 1
ava 2009年11月22日e2
1 ava 22 Nov 2009 find:make_d1:そのようなファイルがないか、 ディレクトリne1 2
ava 2009年11月22日ne2
2 ava 2009年11月22日
これらのエラーが発生していると思います forループが最初に見えるため ユーザーが入力したファイル (変更後のディレクトリ)および それを見つけることができません。これを修正するにはどうすればよいですか? 3.表示されるその他のエラーはありますか?
解決
別の問題は、スクリプトの開始時に行うことです
files = `ls`
その後、別のディレクトリに移動し、$ filesを削除してそれらを削除するループを試みます-もちろん、ディレクトリを変更したため、これは機能しません。
ディレクトリを変更した後、ls行を移動します。
他のヒント
[
の後、]
の前の行にスペースを入れるのを忘れた:
if [! -d $f]
ANDテストは -a
を使用して作成され、 -o
はORと同じです:
if [ ! -d $f -a -f $f ]
if [ ! -d $f -o -f $f ]
[
と!
の間にスペースを入れてみてください。
他の答えは正しいです。理由は次のとおりです。[はコマンドです。 &quot; [!&quot;と入力すると、シェルはその名前のコマンドを探します。
ここで他の回答を増やしています... #で始まるbashの質問が表示されるたびに! / bin / sh
飛び込む必要がありますが、これは道徳的な義務です。
/ bin / sh
は、POSIXによるbashの呼び出し、または完全に異なる「正解の正解」を指していることに注意してください。ダッシュのようなシェル。 / bin / shは多くの場合シンボリックリンクであり、bashの動作をPOSIX準拠に変更します。したがって、多くの便利な機能が通常どおりに機能しないか、別のシェルによってコードが解析されている場合があります。
つまり、/ bin / sh == POSIX_ME_HARDER ですが、.. ==
は bashism :)
bashが必要な場合は、#!/ bin / bash
を使用します
それ以上に、singingwolfboyの答えはあなたの差し迫った問題を解決するはずです:)
他の人は [
で間隔の問題を抱えていましたが、他にもいくつか気づきました。
おそらく23行目の rm
コマンドにスペースが必要です:
rm -r $f
また、通常、ファイルパスを二重引用符で囲むことをお勧めします。これにより、スクリプトがスペースやその他の特殊文字を含むファイル名を正しく処理できるようになります。
rm -r "$f"