переменная по-прежнему пуста после проблемы цикла в сценариях оболочки

96
4

Я очень новичок в сценариях оболочки, и я столкнулся с проблемой, которая достаточно проводная. Программа довольно проста, поэтому я просто разместил ее здесь:

#!/bin/bash

list=""

list='mtx -f /dev/sg2 status | while read status
do
result=$(echo ${status} | grep "Full")
if [ -z "$result" ]; then
continue
else
echo $(echo ${result} | cut -f3 -d' ' | tr -d [:alpha:] | tr -d [:punct:])
fi
done'

echo ${list}

for haha in ${list}
do
printf "current slot is:%s \n" ${haha}
done

Что делает программа, так это то, что она выполняет mtx -f/dev/sg2 status и переходит в каждую строку и видит, есть ли полный диск. Если в этой строке есть "Полный", я записываю номер слота в этой строке и помещаю его в list.

Обратите внимание, что я возвращаю цитату после list= в строке 6, и после этого она охватывает весь цикл while. Причина для меня непонятна, но я получил это использование, просто погубив его. Говорят, что цикл while откроет отдельную оболочку или что-то подобное, поэтому, когда цикл while будет выполнен, все, что вы конкатенируете в цикле, будет потеряно, поэтому в моей первоначальной реализации list по-прежнему остается пустым после цикла while,

Мой вопрос: даже если код выше работает отлично, он выглядит довольно сложно для других, и что еще хуже, я могу сделать только один list после завершения цикла. Есть ли лучший способ исправить это, чтобы я мог вытащить больше информации из цикла? Например, если мне нужно list2 для хранения других значений? Благодарю.

спросил(а) 2021-01-19T19:56:52+03:00 2 месяца, 3 недели назад
1
Решение
107

Сценарий оболочки работает. Если вы хотите получить две части информации за каждую строку, вам придется изменить эту строку

echo $(echo ${result} | cut -f3 -d' ' | tr -d [:alpha:] | tr -d [:punct:])

для объединения желаемых значений, разделенных запятой или любым другим "специальным" символом. Затем вы можете проанализировать свой список следующим образом:

for haha in ${list}
do
printf "current slot is:%s, secondary info:%s \n" $(echo ${haha} | cut -f1 -d',') $(echo ${haha} | cut -f2 -d',')
done

ответил(а) 2021-01-19T19:56:52+03:00 2 месяца, 3 недели назад
44

См. Это объяснение. Поскольку задействована трубка, код while read... в вашей текущей оболочке не выполняется, а в подоболочке (дочерний процесс, который не может обновлять переменные текущего процесса (среды/оболочки)).


Выберите из перечисленных обходных решений, чтобы сделать цикл while while read... в вашей текущей оболочке.

ответил(а) 2021-01-19T19:56:52+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема