for f in ${FILES}; do
((COUNT++))
ln=$(wc -l ${f} | cut -f 1 -d ' ')
echo "File number ${COUNT} (${f}) has ${ln} lines"
done
答え1
for f in ${FILES}; do
((COUNT++))
ln=$(wc -l ${f} | cut -f 1 -d ' ')
echo "File number ${COUNT} (${f}) has ${ln} lines"
done
これがbashのforループの外観です。各項目に対して、(list)
その項目の値を変数という名前で割り当ててから、f
その[...]
セクションを実行します。
for f in (list); do
[...]
done
おそらく、名前付きファイルにスペースで区切られたファイル名文字列が割り当てられています。FILES
FILES="file1 file2 file3"
たとえば、変数の内容にアクセスするには、FILES
変数名の前に$を追加する必要があります。$FILES
書くか${FILES}
上記のコードがリストされているファイル数を計算しようとしているため、どこかにゼロが割り当てられた「COUNT」という変数もあります。
だから私たちは...
FILES="file1 file2 file3"
COUNT=0
for f in ${FILES}; do
[...]
done
fに新しい値が割り当てられるたびに[...]部分が実行されます。
[...]セクションには何がありますか? まずCOUNT変数を追加します。 COUNT ++を使用して増分(COUNT変数を1ずつ増やす)には、算術式を(())で囲む必要があります。
((COUNT++))
次に、各ファイルの行数を取得します。
ln=$(wc -l ${f} | cut -f 1 -d ' ')
それを分解してみましょう。
wc -l ${f}
wc
(lines)オプションが格納され-l
ているファイルの行数を提供する(word count)というプログラムを使用しています。出力$f
は次のとおりです57 file1
(行数、ファイル名)。wc -l ${f}
| cut -f 1 -d ' '
私たちは行数(57)とファイル名ではありません。wc
(file1)、IEの出力を取得し、57 file1
isolateコマンドの入力として使用します。オペレータは、あるコマンドの出力を取得し、別のコマンドの入力として使用します。このオプションは、フィールドを空白に切り捨てることを指定します。つまり、最初のフィールドを出力するという意味です。cut
57
|
-d ' '
-f 1
57
$(
wc -l ${f} | cut -f 1 -d ' '
)
今私たちの命令は57
。割り当てられるように出力をキャプチャするには、ln
次のようにラップする必要があります。$()
最終出力は「ファイル番号1(file1)に57行があります」です。
echo "File number ${COUNT} (${f}) has ${ln} lines"