シェルスクリプトの単一のforループで複数の変数をどのように使用できますか?

シェルスクリプトの単一のforループで複数の変数をどのように使用できますか?

forループを使用して次のコードを実装しましたが、スクリプトを実行した後にエラーが出力されます。

for i in `awk -F"|" '{print $1}' $INPUTFILE`, j in `awk -F"|" '{print $2}' $INPUTFILE`
do
echo $i:$j
done  

シェルスクリプトの単一のforループで複数の変数を使用するのに役立ちます。

答え1

bashは複数の変数を持つループを受け入れますが、Cに似た構文のみを使用します。

for ((i=0,j=10;i<=j;i++,j--))
do
   echo "i=$i"
   echo "j=$j"
done

答え2

おそらく、あなたは実際に次のことをしたいと思います。

while IFS='|' read -r i j rest <&3; do
  {
    printf '%s\n' "something with $i and $j"
  } 3<&-
done 3< "$INPUTFILE"

しかし、シェルループを使用してテキストを処理することは、通常、間違ったアプローチです。

これには次のものが必要なようです。

awk -F '|' '{print $1 ":" $2}' < "$INPUTFILE"

タイトルの質問に対する回答として、for複数の変数を持つループを持つシェルの場合zsh、 )。

$ for i j in {1..6}; do echo $i:$j; done
1:2
3:4
5:6

またはより短い形式:

for i j ({1..6}) echo $i:$j

POSIXシェルと同じ:

set -- 1 2 3 4 5 6
## or:
# IFS='
# ' # split on newline
# set -o noglob # disable globbing
# set -- $(awk ...) # split the output of awk or other command
while [ "$#" -gt 0 ]; do
  printf '%s\n' "$1:$2"
  shift 2
done

答え3

ファイルの出力を変数に保存してから、2つの部分に分けることができます。例:

存在するはいファイルの内容は次のとおりです。

a:1
b:2
c:3
d:4

今スクリプトです。

#!/bin/bash
for n in $(cat example)
do
    first=$(echo $n | cut -d ":" -f 1)
    second=$(echo $n | cut -d ":" -f 2)
    echo $first
    echo $second
done

答え4

組み込みシステムでは、利用可能なアイテムのために困難を経験することがよくあります。例えば。for変数は1つしかありません。awk& はprintfまったく使用できないかサポートされてIFSいません。

このような場合は、次のように目標を達成できます。

export i=xxx
for j in `cat INPUTFILE` ; do \
    [ $i == xxx ] && export i=$j && continue ; \
    echo "$i:$j" ; \
    export i=xxx ; \
done
unset i

より一般的な形式の解決策は次のとおりです。

export A=xxx
export B=xxx
for i in 1 2 3 4 5 6 7 8 9 10 11 ; do \
    [ $A == xxx ] && export A=$i && continue ; \
    [ $B == xxx ] && export B=$i && continue ; \
    echo "$A:$B:$i" ; \
    export A=xxx ; \
    export B=xxx ; \
done
unset A
unset B
  • 文字列 "xxx"がデータセットにまったく表示されないとしましょう。それが表示される場合は、別のものを選択してください。
  • 各「レコード」には「フィールド」がいくらでもあります。 {A、B、...}フィールドを処理する4つの行をそれぞれコピーします。
  • 最後のフィールドは常に$ i ...と呼ばれます。役に立つ場合は、export C=$i前にフィールドを追加できます。echo
  • データセット内の文字列の数がレコードサイズの倍数ではない場合、「残り」(例:|set|%|record|)は失われます。

関連情報