2016-10-27 6 views
-3

This is a crawler from GitHub自分で実装するのですが、初心者ですからbashを読むことができません。これは、具体的な答えbashでwhileループを読み込むにはどうすればよいですか?

#!/bin/bash 

# Create an array files that contains list of filenames 
files=($(< url.txt)) 
cities=($(< city.txt)) 
url="http://www.grotal.com/" 
citycodes=($(<citycode.txt)) 

# Read through the url.txt file and execute wget command for every filename 
while IFS='=| ' read -r param uri; do 
    for file in "${files[@]}"; do 
     for city in "${cities[@]}"; do 
      mkdir "${city}" 
      mkdir "${city}/${file}" 
      wget -O "${city}/${file}/${file}${citycodes[@]}" "${uri}${url}${city}/${file}-${citycodes[@]}/" 
     done 
    done 
done < url.txt 

に説明することができ、これらの(uは... downvoteすることを選択した場合でも)

while IFS='=| ' read -r param uri; 

してから、この:

done < url.txt 
+0

「while read」ループについて詳しく説明している[BashFAQ#1](http://mywiki.wooledge.org/BashFAQ/001)を参照してください。 –

+0

また、 'files'と' cities'配列の配置方法は非常にバグです。 'mapfile -t'や' readarray -t'や 'read -r -a'はずっと良いでしょう。 –

+1

とにかく - あなただけが* "どうすればbashでループを読むことができますか"と尋ねるならば、それははるかに良い質問になるでしょう。ループ本体の内容、以前の設定内容、&c。質問の範囲をここでの話題性が疑わしいところまで広げます。 http://stackoverflow.com/help/how-to-askを参照してください。特に、何が良いタイトルになるかについての部分(個々の質問に固有である必要があります) –

答えて

2

が粉々にこれを打破するのをしてみましょう:

  • readただし、giデフォルト以外の-d引数を指定すると、改行の代わりに使用するターミネータを指定し、stdinから1行を読み込みます(つまり、次の改行まで読み込みます)。その行をIFS文字で分割し、各フィールドを別の変数に書き込みます。改行に達する前にさらにデータを読み取ることができなくなると、という変数を正常に設定しても、0以外の終了ステータス、が出力されます。 (-r引数は、readがバックスラッシュをリテラルではなく継続文字として扱うことを防ぎます。ただし、継続文字を当面のコンテキストで利用できる特別な理由がない場合は、デフォルトでに-rを渡す必要があります)。
  • < url.txtは、追加されたコマンド(whileループなどの複合コマンドを含む)に対して、url.txtの読み取りハンドルをstdinにリダイレクトします。
  • whileループは、与えられた条件付きコマンドを実行し、その条件が成功または失敗を報告しているかどうかを確認し、その後本体を実行して成功するか、失敗した場合に終了します。

したがって、IFS='=| ' read -r param uriがあると、stdinから1行読み込みます。最初の=,|までのすべてを代入するか、paramという名前の変数にスペースを割り当て、残りの変数をuriに代入します。

whileループの条件付き部分に入れた場合、ループはreadが失敗するまで動作します。これ以上のコンテンツ(改行文字を含む)が存在しない場合読む。

イディオムとその使用の詳細については、BashFAQ #1を参照してください。


一部asides:

  • mkdir -p -- "${city}/${file}"を使用するには、あなたは両方のディレクトリを作成します(そして、彼らがすでに存在する場合、エラーメッセージを生成回避)のみの単一mkdirコマンドを持つようになります。
  • readarray -t files < url.txtを使用すると、url.txtの内容をfilesという名前の配列に読み込むより堅牢な方法ですが、bash 4.0以降が必要です。古いバージョンのシェルの場合は、IFS=$'\n' read -r -d '' -a files <url.txt || ((${#files[@]}))と考えてください。入力ファイルにワイルドカード、空白、その他の予期しない内容がある場合、これらは元のイディオムよりはるかに優れた動作をします。
関連する問題