Как получить индекс массива внутри цикла в сценарии оболочки - PullRequest
0 голосов
/ 08 июня 2019

cmd - это массив, я хотел бы grep каждый индекс:

for i in "${cmd[@]}";
do
a=`deep status | grep "${cmd[$i]}" |  awk  '{print $2 ~ /RUNNING/}'

Но это не работает a должен содержать 1 или 0, но яне получая процесс:

cmd[@]: ERROR (no such process)

1 Ответ

1 голос
/ 08 июня 2019

Вы перебираете содержимое массива, затем пытаетесь использовать элемент в качестве индекса.Вы должны использовать элемент непосредственно в качестве аргумента:

for i in "${cmd[@]}"
do
    a=$(deep status | awk -v my_var="$i" '$0 ~ my_var {print $2 ~ /RUNNING/}')
done

Возможно выполнить итерации по индексам, а затем использовать индекс в ссылке на массив, но это, вероятно, не требуется, если вам не нужно что-то делатьс самими индексами:

for i in "${!cmd[@]}"    # Note the "!"
do
    echo "$i"    # or some other operation using the index
    a=$(deep status | awk -v my_var="${cmd[$i]}" '$0 ~ my_var {print $2 ~ /RUNNING/}')
done

Обратите внимание, что нет необходимости передавать grep в awk, так как последний может выполнить сопоставление самостоятельно.Я использовал $0 здесь, но вы можете быть более точным, если знаете, какое поле вы пытаетесь сопоставить.

Кроме того, многократное выполнение одной и той же команды в цикле может быть медленным.В зависимости от того, как работает «глубокий статус» и от формата вашего массива, вы можете сделать все это без цикла for.

и использовать $() вместо обратных галочек.Они гораздо более читабельны и легче вкладываются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...