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|)は失われます。