1

さて、基本的には、この形式のテキスト ファイルを使用できるようにしたいと考えています。

www.website.com 443 123.456.789.098
www.website2.com 443 765.432.101.234
....

スクリプトが Web サイトのアドレスを取得して変数に保持する入力のソースとして、ポートと IP アドレスと同じことを行います。したがって、次のようになります。

website=www.website.com
port=443
ip=123.456.789.098

これまでのところ、私はこれを試しました:

for line in [ cat $file_name ]; do
    website=`echo $line | cut -d" " -f1`
    port=`echo $line | cut -d" " -f2`
    ip=`echo $line | cut -d" " -f1`

しかし、変数をエコーアウトすると、次のようになります。

[
[
[

この問題を解決する方法がわかりません。

4

3 に答える 3

3

代わりに次のパターンを使用します。

while read line ; do
    ... loop body ...
done < "$file_name"

説明:for var in word-listリスト内の単語を順番に変数に割り当てます。したがって、最初のループでは、(リストの最初の単語) に$line展開されます。[次の単語は でcat、次に の値ですfile_name

ファイルから読み取るには、I/O リダイレクトを使用する必要があります。

while一方、引数として渡したコマンドを実行します ( read line)。readから1行を読み取りstdin、引数として渡した変数に値を入れます。

奇数は読み取り用にdone < $file_name設定stdinします。生活をさらにシンプルにするために、 を使用readして入力を分割できます。

while read website port id ; do
    ...
于 2012-07-03T12:45:37.700 に答える
2
while read WEBSITE PORT IP
do 
    echo $WEBSITE $IP $PORT ; 
done < file

ただし、サイクルが終了すると、この変数を使用できなくなります。

于 2012-07-03T12:50:55.633 に答える
2

forデフォルトでは行ごとに読み取らず、$IFS で区切られたトークンを読み取ります。デフォルトでは、IFS には通常、スペース、タブ、および改行が含まれています。bash に (空白で区切られたトークンではなく) 1 行ずつ読み取るように強制する場合は、次のようにします。

IFS=`echo -ne '"\n"'`; for line in `cat $file`; do echo $line; done

「インライン」cat $fileを実行する前後のバッククォートに注意してください。cat

を使用するreadことも別の方法です。IFS (Internal Field Separator)を変更するよりも確実に読みやすく理解しやすい

于 2012-07-03T13:03:17.723 に答える