Я только что справился с этим:
TATVAR="${PARAMVAR//[[:blank:]]/}"
Буду рад, если кто-нибудь подтвердит, что это правильно.
Несмотря на то, что использование массива явно предпочтительнее, если вам действительно нужна индивидуальная ip$number
версия, попробуйте
eval
ваше задание ip$i=$word
внимательно смотрите на цитирование (с мерами предосторожности рег. устаревшее eval
в виду)for word in $ip; do read ip$((++CNT)) <<< $word; done
Крайне маловероятно, что вам на самом деле нужны отдельные переменные для каждого отдельного IP-номера. Было бы удобнее хранить IP-номера в массиве.
ipnumbers=( $ip )
Такое использование $ip
без кавычек (предполагает, что значение переменной IFS
по умолчанию )разделяет ее значение на пробелы (и вызывает подстановку имен файлов в результирующих словах, но это не должно быть проблема, поскольку в данных )нет шаблонов подстановки имен файлов.Затем он назначит разделенные слова как отдельные элементы в массиве ipnumbers
.
Затем вы можете получить доступ к отдельным элементам, используя, например,."${ipnumbers[1]}"
(для второго элемента )или перебрать их с помощью
for ipnum in "${ipnumbers[@]}"; do...; done
Лучше использовать переменную массива.
readarray -t -d ' ' ips <<<"$ip"
Это не использует разделение оболочки "без кавычек", которое обычно проблематично с символами новой строки, подстановочными символами (*
, ?
,[]
)и чем-то еще. Затем просто напечатайте массив:
printf '%s\n' "${ips[@]}"
Или используйте его в цикле:
for i in "${ips[@]}"; do
echo "$i"
done