我正在使用 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)
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)
在这里,听起来您只需要:
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)
$ 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
如果您想迭代多个变量(例如for i in 1 2 3; do for j in a b c; do ...; done; done. 当要迭代的内容列表是另一个命令的输出时,您需要将另一个命令包装在$().