Может быть, вы действительно хотите:
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
(кажется, что вы уже используете синтаксис 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 -f # disable globbing
# set -- $(awk ...) # split the output of awk or other command
while [ "$#" -gt 0 ]; do
echo "$1:$2"
shift 2
done