2009-06-24 7 views
2

おはようございます、私は問題について悩んでいます。私は何年か前に同様のことをして、これをベースにしています(これは別のサーバー上にあります)。私はそれの中にいくつかのディレクトリを持っているディレクトリからスクリプトを実行する必要があります、そして、それはディレクトリを作成し、所有権を変更する各ディレクトリのために。スクリプトは次のとおりです。ディレクトリを裏返していくつかの処理を実行するBashシェルスクリプト

 
#!/bin/bash 
for DIR in *; 
do 
mkdir $DIR/photos2; 
chown apache:apache $DIR/photos2; 
chmod 777 $DIR/photos2; 
done 

私が取得を実行しようとしている - 予期しないトークンの近くに構文エラーが `「

私は確信している、それは私が欠けている愚かなものである、任意の助けをいただければ幸いです。

答えて

2

は、おそらくこのような何かをしたい:bashが行指向であり、同じライン上にあるように「ん」期待するので、「やる」と

#!/bin/bash 
for DIR in *; do 
    if [ -d "$DIR" ]; then 
     mkdir "$DIR/photos2" 
     chown apache:apache "$DIR/photos2" 
     chmod 777 "$DIR/photos2" 
    fi 
done 
  • エラーです。もちろん、代わりに行の最後に\を置くことができます。 編集:これは正しくありません。恐らくそれほど教育されていない推測であろう。
  • コマンドが異なる行にある場合、セミコロンは必要ありません。
  • ファイル名にスペースがある場合は、$ DIRを引用符で囲む必要があります。
+0

'を'と同じ行に置くことを選択した場合は、 ';'が必要です。私はこれを回避するための他の制約をbashで見たことがありません。 – nik

+1

ここに挙げられている他の問題のどれも 'do'の近くで構文エラーを呼び出さないでしょう。 – nik

+1

if文は "for DIR in * /"のように見えます(追加されたスラッシュに注意してください)。 –

1

いずれか

for DIR in * 
do 

または

for DIR in *; do 
+0

私はこれらのフォームが両方ともbashでうまくいくと思います。 – nik

+0

行末のセミコロンは許可されます。質問のフォームも機能します。 –

2

私は、彼らがDOSフォーマットにいたとき、面白い事がスクリプトで発生見てきました。
Windowsプラットフォームでコードを書いて、他の場所のbashシェルから実行しようとしていますか?その後、bashシェルで

あなたがそれを見つけた場合、通常のコマンドは、dos2unixが呼び出されます、実行してみては、

dos2unix scriptname 

と、もう一度スクリプトを実行します。


さらにもう一度チェックしてください。「予期しないトークン 'do'」と「done」以外のエラーがありますか?
はとにかく、私はあなたが(あなたのファイル名が空白文字を持っていませんが)、これがベースディレクトリから作業を行う必要があり、一方


for loop at the bash guideを読むことをお勧め。

#!/bin/bash 
for DIR in $(find . -type d); 
do 
    mkdir $DIR/photos2; 
    chown apache:apache $DIR/photos2; 
    chmod 777 $DIR/photos2; 
done 
+0

あなたは正しいと思います。最初の2行(shebangとfor)にUnix行の終わりがあり、3行目(do)にWindows行の終わりがあると、私はaskerが報告するのと同じエラーになります。私はSolaris上でBash 4を実行しています。 –

+0

".max"の後ろに "-maxdepth 1"が必要な場合があります。あなたのfindコマンドで。しかし、あなたが "DIR in * /"のように見える場合は、findは必要ありません(追加されたスラッシュに注意してください)。 –

+0

@Dennis、それは参照ベースディレクトリからディレクトリの1つのレベルに制限したい場合にはかなり正しいです。しかし、その質問はそれを特に示唆していませんでした。 – nik