【问题标题】:loop every variable once in bash and not loop it every other variable in second loop?在bash中循环每个变量一次,而不是在第二个循环中循环每个其他变量?
【发布时间】:2018-10-13 19:04:18
【问题描述】:

如何在 bash 中循环每个变量一次?

我已经尝试了两个 for 循环,但它正在循环给定变量和循环中的每隔一个第二个变量!

试过

for i in 4k 1m 1m
do
   for j in 1m 2m 4m
   do
   echo $i $j
   done
done

输出

4k 1m
4k 2m
4k 4m
1m 1m
1m 2m
1m 4m
1m 1m
1m 2m
1m 4m

期望的输出

4k 1m
1m 1m
1m 2m

【问题讨论】:

  • 我很困惑。我真的看不出你的“期望输出”背后的逻辑。

标签: linux bash awk sed scripting


【解决方案1】:

我假设您的列表存储在其他地方;否则,解决方案是从适当的此处文档中读取:

while read -r i j; do
  echo "$i" "$j"
done <<EOF
4k 1m
1m 1m
1m 2m
EOF

但假设您有list1=( 4k 1m 1m)list2=(1m 2m 4m)bash 没有提供一种特别干净的方式将两个数组“压缩”在一起。您可以做的最好的事情是假设两个列表具有相同的索引,并遍历这些:

list1=(4k 1m 1m)
list2=(1m 2m 4m)
for k in "${!list1[@]}"; do
  i=${list1[k]}
  j=${list2[k]}
  echo "$i" "$j"
done

【讨论】:

    【解决方案2】:
    $ is=( 4k 1m 1m )
    $ js=( 1m 2m 4m )
    $ paste <(printf '%s\n' "${is[@]}") <(printf '%s\n' "${js[@]}")
    4k      1m
    1m      2m
    1m      4m
    

    https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice

    【讨论】:

    • 我希望它循环播放!
    • 但是为什么呢?这几乎肯定是做任何你想做的事情的错误方法。请参阅我在答案中提供的链接。
    • 我将使用这个变量作为命令的输入。我希望命令组合使用这两个变量
    • 那很好,但同样,像您要求的循环仍然几乎可以肯定是错误的方法。作为一个简单的示例,将| xargs -n2 printf '&lt;%s:%s&gt;\n' 添加到paste 行的末尾,您将看到printf 一次被调用2 个值,并且不需要循环。如果您发布的问题表明您真正想要做什么,那么我们可以为您提供帮助。
    猜你喜欢
    • 2017-03-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    相关资源
    最近更新 更多