Предположим, у меня есть переменная оболочки Unix, как показано ниже
variable=abc,def,ghij
Я хочу , чтобы извлечь все значения ( abc
, def
и ghij
) , используя для цикла и передавать каждое значение в процедуру.
Скрипт должен позволять извлекать произвольное количество значений, разделенных запятыми, из файлов $variable
.
Ответы:
Вы можете использовать следующий скрипт для динамического обхода вашей переменной, независимо от того, сколько в ней полей, если они разделены запятыми.
Вместо приведенного
echo "$i"
выше вызова между циклом fordo
иdone
внутри цикла вы можете вызвать свою процедуруproc "$i"
.Обновление : приведенный выше фрагмент работает, если значение переменной не содержит пробелов. Если у вас есть такое требование, воспользуйтесь одним из решений, которые могут измениться,
IFS
а затем проанализируйте свою переменную.Надеюсь это поможет.
источник
$variable
содержит пробелы, напримерvariable=a b,c,d
=> печатает 4 строки (a | b | c | d), а не 3 (ab | c | d)"value
**. не могли бы вы обновить, если есть какое-нибудь регулярное выражение для удаления этого ..Не возиться с IFS
Не вызывать внешнюю команду
Использование строковых манипуляций в bash http://www.tldp.org/LDP/abs/html/string-manipulation.html
источник
IFS
!$i
содержит пробелы, они будут разделены (и это может быть причиной того, что оно было передано как разделенное запятыми, а не разделенное пробелом)for i in ${variable//,/$IFS} do; echo "$i"; done
Если вы установите другой разделитель полей, вы можете напрямую использовать
for
цикл:Вы также можете сохранить значения в массиве, а затем просмотреть его в цикле, как указано в разделе Как разбить строку по разделителю в Bash? :
Тест
Вы можете найти более широкий подход в этом решении, как пройти по списку, разделенному запятыми, и выполнить команду для каждой записи .
Примеры второго подхода:
источник
while
для чтения в массив и еще один для просмотра результатов.IFS
вернуться к тому, что было раньше?Я предпочитаю использовать tr вместо sed, потому что в некоторых случаях sed имеет проблемы со специальными символами, такими как \ r \ n.
другое решение - установить IFS на определенный разделитель
источник
Вот альтернативное решение на основе tr, которое не использует эхо, выраженное как однострочное.
Без эха он выглядит аккуратнее, но это только мое личное предпочтение.
источник
Попробуй это.
источник
http://stackoverflow.com/questions/8629330/unix-count-of-columns-in-file
. После этого превратите цикл for в цикл while. Вы можете получить это.Другое решение, не использующее IFS и все еще сохраняющее пробелы:
источник
Вот мое чистое решение bash, которое не меняет IFS и может принимать настраиваемый разделитель регулярных выражений.
источник