区切り文字を使用して行を分割し、両方のフィールドを別の変数に格納します。

区切り文字を使用して行を分割し、両方のフィールドを別の変数に格納します。

複数行のテキスト ファイルがあります。while コマンドを使用してファイルを行単位で読み取りますが、値を別々の変数に保存し、末尾のシェル スクリプトで使用する必要があります。

カットコマンドは読み取り行ではなくファイル全体を区切ります。

my_file.txt

d1:jobid1
id2:jobid2

私は以下のwhileループを使用してファイルを行ごとに読み取ります

while IFS= read -r line; do
    jobid=`cut -d: -f2`
    id=`cut -d: -f1`

#remaining shell-script dependent upon variables#

done < my_file.txt

各行のジョブ ID と ID を保存しmy_file.txt、末尾のスクリプトを実行したいと思います。各行は新しい行にあります

変数に値を再帰的に格納するための支援が必要です。行ごとに読み取り、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これは、 が入力行からデータを一度に複数の変数に読み込むことができるという事実を利用しています。IFSをコロンに設定すると、行はコロンで分割され、最初のフィールドが に読み込まれid、残りは に読み込まれます。 を呼び出す必要はまったくjobidありません。cut

関連情報