Как перебрать два аргумента в оболочке sh linux - PullRequest
2 голосов
/ 18 октября 2019

У меня есть два набора аргументов: a = "5 7 1" и b = "dogs cats horse"

Они должны быть в парах: 5 совпадений dogs, 7 совпадений cats и 1 совпадений horse

Они также должны сделать это в одной строке:

I have 5 whatever dogs whatever whatever
I have 7 whatever cats whatever whatever
I have 1 whatever horse whatever whatever

Проблема в том, что $a и $b могут иметь сотни аргументов, поэтому писать много строк, напримервышеприведенные варианты на самом деле не подходят.

Я нашел что-то вроде следующего, которое выполняет работу:

a = "5 7 1"
b = "dogs cats horse"

set -- $a
for i in $b; do
  echo "I have $i whatever $1 whatever whatever"
  shift 1
done

, но мне интересно, есть ли другие альтернативы.

Обычно, когда у нас всего 3 пары, в скрипте легко узнать, какие значения из $a соответствуют каким значениям $b. Теперь представьте 200 значений в обоих наборах, и вам нужно изменить значения $b, где значения $a равны 50 и 157. Конечно, это всего лишь пример - любые значения могут меняться в обоих наборах со временем. Так есть ли лучший способ сопоставить значения что-то вроде 5:dogs, 7:cats и 1:cats? Таким образом, если количество собак изменится на 4, я легко найду, что изменить.

Ответы [ 2 ]

2 голосов
/ 18 октября 2019

Если вы можете использовать 'bash', вы можете использовать ассоциативный массив (и mapfile / readarray), но это не будет хорошо масштабироваться до количества элементов, которые вы упомянули (200+).

Длярешение, которое не относится к bash: рассмотрите возможность сохранения пар в файле (или встроенном документе, см. ниже).

dogs:5
cats:7
horse:1

Затем используйте скрипт:

while IFS=: read k v ; do
  echo "I have $v whatever $k whatever whatever"
done < file.txt

Вы также можете встроитькарта в << документ. </p>

while IFS=: read k v ; do
  echo "I have $v whatever $k whatever whatever"
done <<EOF
dogs:5
cats:7
horse:3
EOF


2 голосов
/ 18 октября 2019

Можно использовать что-то вроде этого:

#!/bin/bash

a="5 7 1"
b="dogs cats horse"

c=( $a )
d=( $b )

for i in ${!c[@]}; do
    echo "There are ${c[$i]} of ${d[$i]}"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...