
Linux スクリプトに次のコマンドがあります。
#!/bin/bash
for i in "001 ARG1" "002 ARG2" "003 ARG3"
do
set -- $i
echo $1
echo $2
done
001とARG1は基本的にタプルであり、
これらのタプルをテキストファイルに移動して、代わりにforloopにロードする方法はありますか? 非常に多いので、次のようにテキストファイルを保存します
ARG1
ARG2
ARG3
または
001 ARG1
002 ARG2
003 ARG3
そして脚本は
for i in textfile.txt
do
set -- $i
echo $1
echo $2
done
同じ結果が得られますか?
また、001 002 が自動的にカウントされるようにする方法はありますか? Python で counter = 0 と counter+=1 を設定し、変数を割り当てる方法のように。
答え1
入力ファイルの 2 番目の例のように、ファイルの各行にスペースまたはタブで区切られた 2 つの単語があるとします。
while read -r word1 word2; do
echo "$word1"
echo "$word2"
done <textfile.txt
これにより、各行の最初の単語が に読み込まれ$word1
、行の残りが に読み込まれます$word2
。
の入力は複合コマンドread
の入力によって与えられwhile
、リダイレクトを介してファイルから取得されます。
入力にその文字が発生した場合に、特別な方法で解釈しないようにするオプション-r
です。read
\
1 行に 1 つの単語とカウンターがある場合:
counter=0
while read -r word; do
counter=$(( counter + 1 ))
echo "$counter"
echo "$word"
done <textfile.txt
これにより、各反復( から読み取られる各行textfile.txt
)ごとにカウンターが 1 ずつ増加します。
printf
ゼロで埋められた 3 桁のカウンターを取得するには、次の書式設定文字列を使用してカウンターを出力します%.3d\n
。
printf '%.3d\n' "$counter"
... 代わりにecho "$counter"
。
の意味については%.3d\n
、C ライブラリ関数 ( ) のドキュメントを参照してください。シェルの同等の機能ではprintf
、man 3 printf
主に同じ書式文字列が使用されます。