Разделите переменную на несколько переменных в петле

Я только что справился с этим:

TATVAR="${PARAMVAR//[[:blank:]]/}"

Буду рад, если кто-нибудь подтвердит, что это правильно.

0
11.12.2018, 11:16
3 ответа

Несмотря на то, что использование массива явно предпочтительнее, если вам действительно нужна индивидуальная ip$numberверсия, попробуйте

  • evalваше задание ip$i=$wordвнимательно смотрите на цитирование (с мерами предосторожности рег. устаревшее evalв виду)
  • маленькая петля типаfor word in $ip; do read ip$((++CNT)) <<< $word; done
0
28.01.2020, 02:18

Крайне маловероятно, что вам на самом деле нужны отдельные переменные для каждого отдельного IP-номера. Было бы удобнее хранить IP-номера в массиве.

ipnumbers=( $ip )

Такое использование $ipбез кавычек (предполагает, что значение переменной IFSпо умолчанию )разделяет ее значение на пробелы (и вызывает подстановку имен файлов в результирующих словах, но это не должно быть проблема, поскольку в данных )нет шаблонов подстановки имен файлов.Затем он назначит разделенные слова как отдельные элементы в массиве ipnumbers.

Затем вы можете получить доступ к отдельным элементам, используя, например,."${ipnumbers[1]}"(для второго элемента )или перебрать их с помощью

for ipnum in "${ipnumbers[@]}"; do...; done 
3
28.01.2020, 02:18

Лучше использовать переменную массива.

 readarray -t -d ' ' ips <<<"$ip"

Это не использует разделение оболочки "без кавычек", которое обычно проблематично с символами новой строки, подстановочными символами (*, ?,[])и чем-то еще. Затем просто напечатайте массив:

 printf '%s\n'  "${ips[@]}"

Или используйте его в цикле:

for i in "${ips[@]}"; do
    echo "$i"
done
1
28.01.2020, 02:18

Теги

Похожие вопросы