我们如何在shell脚本的单个for循环中使用多个变量?

use*_*033 9 shell-script for

我正在使用 for 循环实现如下代码,但运行脚本后输出错误。

for i in `awk -F"|" '{print $1}' $INPUTFILE`, j in `awk -F"|" '{print $2}' $INPUTFILE`
do
echo $i:$j
done  
Run Code Online (Sandbox Code Playgroud)

请帮助我在 shell 脚本的单个 for 循环中使用多个变量。

Dan*_*i_l 19

bash 允许包含多个变量的循环,但仅限于类似 C 的语法:

for ((i=0,j=10;i<=j;i++,j--))
do
   echo "i=$i"
   echo "j=$j"
done
Run Code Online (Sandbox Code Playgroud)

  • 如何从 $INPUTFILE 读取 i 和 j ? (2认同)

Sté*_*las 18

也许你真的想要:

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

但是使用 shell 循环处理文本通常是错误的方法

在这里,听起来您只需要:

awk -F '|' '{print $1 ":" $2}' < "$INPUTFILE"
Run Code Online (Sandbox Code Playgroud)

现在作为标题中问题的答案,对于一个带有for多个变量的循环的 shell ,你已经得到了zsh(你似乎已经在使用 zsh 语法,在拆分命令替换时不引用变量或不禁用通配符):

$ for i j in {1..6}; do echo $i:$j; done
1:2
3:4
5:6
Run Code Online (Sandbox Code Playgroud)

或者更短的形式:

for i j ({1..6}) echo $i:$j
Run Code Online (Sandbox Code Playgroud)

等效于 POSIX shell:

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
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以将文件的输出存储在变量中,然后将其分成两部分。例子:

示例文件内容为:

a:1
b:2
c:3
d:4
Run Code Online (Sandbox Code Playgroud)

现在脚本。

#!/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
Run Code Online (Sandbox Code Playgroud)


Jon*_*ies 6

$ cat inputfile.txt
foo|bar
baz|foobar
$ cat inputfile.txt | while IFS='|' read i j ; do echo $i:$j ; done
foo:bar
baz:foobar
Run Code Online (Sandbox Code Playgroud)

这个答案很像这个答案,但它也回答了@sdkks关于不必使用文件描述符( )的评论<&3


Hen*_*ity 0

如果您想迭代多个变量(例如for i in 1 2 3; do for j in a b c; do ...; done; done. 当要迭代的内容列表是另一个命令的输出时,您需要将另一个命令包装在$().