L oop над подстроками, разделенными запятыми, без разбивки на пробелы - PullRequest
1 голос
/ 07 мая 2020

У меня есть переменная, например, со значениями, разделенными запятыми, и мне нужно l oop, и я использую код ниже

Var=test_v1,"Log Processor",test_v2
for i in ${Var//,/ }
do
    echo "Variables are  "${i}" assined"
done

Выходы:

Variables are test_v1 assined
Variables are Log assined
Variables are Processor assined

Он не принимает целое слово с двойными кавычками как одинарные, а вывод дает мне, как будто журнал и процессор разные, но его одно значение.

1 Ответ

3 голосов
/ 07 мая 2020

Либо (лучше) используйте read -a для чтения в массив:

#!/usr/bin/env bash
#              ^^^^ arrays are a bash feature, not guaranteed in /bin/sh
Var=test_v1,"Log Processor",test_v2
IFS=, read -a Array <<<"$Var"          # this updates IFS only for the duration of 'read'
for i in "${Array[@]}"; do             # now loop over elements in the array read created
    echo "Variables are ${i} assined"
done

Или (хуже) измените IFS, чтобы он содержал только символы, которые вы хотите использовать для разделения полей и отключения подстановки, поэтому вы можете безопасно использовать расширение без кавычек:

Var=test_v1,"Log Processor",test_v2
IFS=,              # set the comma as the only field separator
set -f             # disable globbing
for i in $Var; do  # perform an unquoted expansion to split on IFS
    echo "Variables are ${i} assined"
done
# WARNING: This code left globbing disabled and ',' as the only field separator!

Поскольку ${Var//,/ } заменяет запятые на пробелы, в результате все пробелы и запятые неразличимы, поэтому вы разделяете их на оба. Не делай этого; вместо этого считайте массив и перебирайте его содержимое.

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