Зацикливать каждую переменную один раз в bash, а не зацикливать ее все остальные переменные во втором цикле - PullRequest
0 голосов
/ 03 мая 2018

как зациклить каждую переменную один раз в bash?

Я пробовал два для цикла, но он зацикливает данную переменную с каждой второй переменной в цикле!

Пытались

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

Ответы [ 2 ]

0 голосов
/ 03 мая 2018
$ 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

0 голосов
/ 03 мая 2018

Я предполагаю, что ваши списки хранятся в другом месте; в противном случае решение будет читать из соответствующего здесь документа:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...