2012-01-26 4 views
0
if [ ! -f ./* ]; then 
    for files in $(find . -maxdepth 1 -type f); do 
    echo $files 
else 
    echo Nothing here 
fi 

返し場合はelse文でループのネスト

これまで予期しないトークン「`他

新しい近く

構文エラー。誰かが私が間違ったことを私に指摘することはできますか?

+0

私は投票しませんでしたが、最後のエコーには1つの引用符があります。 –

+0

全く別の問題で質問を変更しないでください。あなたはすでに3つの答えがあり、あなたは「済んでいません」と言いました。あなたのコードは実際にはあまり意味がありません。あなたが存在しない場合、ディレクトリにcdしたいですか?なぜあなたはファイルの最初の行を読むことはファイル名を与えることを期待するのですか? – jordanm

+0

@jordanm 'これに新しくなりました。 nvrは昨日までシェルスクリプトを書いていました。なぜなら私の上司はサーバー上に作成されたスクリプトと元々はそれをやめる人を必要としていたからです。私はここで試しています=/ – Mechaflash

答えて

3

あなたは忘れましたdone

if [ ! -f ./* ]; then 
    for files in $(find . -maxdepth 1 -type f); do 
    echo $files 
    done 
else 
    echo Nothing here 
fi 
0

"のために" の構文は

あるため:NAMEための[WORDSで...;]ないコマンド。

行わあなたは

はところで、あなたは小文字ではなく、ECHOでエコーを意味するのですか?

if [ ! -f ./* ]; then 
    for files in $(find . -maxdepth 1 -type f); do 
    echo $files 
    done 
else 
    echo Nothing here 
fi 

を試してみて "完了" を欠けていますか

+0

'BTW、ECHOではなく小文字でエコーしたのですか?ありがとう – Mechaflash

3

構文エラーが発生する理由は、ループが「完了」ステートメントで終了していないためです。この場合、forループの代わりにwhileループを使用してください。ファイル名のいずれかにスペースや改行が含まれていると、forループが壊れます。

また、globが複数のファイルに展開されると、発行したtestコマンドでも構文エラーが発生します。ここで

$ [ ! -f ./* ] 
bash: [: too many arguments 

がディレクトリのすべてのファイルが含まれているかどうかを確認するためのより良い方法です:

を:

files=(./*) # populate an array with file or directory names 
hasfile=false 
for file in "${files[@]}"; do 
    if [[ -f $file ]]; then 
     hasfile=true 
     break 
    fi 
done 

if $hasfile; then 
    while read -r file; do 
     echo "$file" 
    done < <(find . -maxdepth 1 -type f) 
fi 

あなたはGNU見つけた場合は、あなたは、単に検索-printとwhileループを置き換えることができます

if $hasfile; then 
    find . -maxdepth 1 -type f -print 
fi 
+0

あなたは私のファイルチェックについて正しいです。私もそれを変更します。 – Mechaflash