複数行を含むテキストファイルがあります。ファイルを 1 行ずつ読み取るには while コマンドを使用します。別の変数に値を格納し、末尾のシェルスクリプトで使用する必要があります。
これ切るこのコマンドは、読み取った行ではなくファイル全体を区切ります。
例my_file.txt
:
d1:jobid1
id2:jobid2
以下のwhileループを使用してファイルを1行ずつ読み込んでいます。
while IFS= read -r line; do
jobid=`cut -d: -f2`
id=`cut -d: -f1`
#remaining shell-script dependent upon variables#
done < my_file.txt
my_file.txt
各行のjobidとidを保存し、末尾のスクリプトを実行したいと思います。各行は新しい行です
変数に値を再帰的に格納するのに役立ちます。 1行ずつ読み、2つのフィールドを別々に分離して保存するより良い方法がある場合。
ベストアンサー1
cut
デフォルトは標準入力から読み取ることです。コマンド置換では、標準入力はループの標準入力から継承されます(呼び出しに他の明示的な入力を提供しないためcut
)。ループの標準入力は入力ファイルから出力されます。
その結果、ファイルの最初の行が読み取られ、最初の呼び出しで他のすべてのread
行が読み取られますcut
。したがって、変数の値はjobid
改行で区切られたジョブID文字列になり、id
変数は空になります。このループは、1回の反復中にのみ実行されます。
あなた利用できる、例えば、
id=$( printf '%s\n' "$line" | cut -d: -f1 )
# or: id=$( cut -d: -f1 <<<"$line" )
# (in shells that supports "here-strings")
しかし、これはよりクリーンで効率的であるため、必要ありません。
while IFS=: read -r id jobid; do
# code that uses "$id" and "$jobid" goes here
done <my_file.txt
read
これは、入力データの1行を同時に複数の変数として読み取ることができることを利用します。コロンに設定すると、IFS
行はコロンから分割され、最初のフィールドを読み取り、残りのフィールドid
をから読み込みますjobid
。cut
まったく電話する必要はありません。