Передача значений из разделенной запятыми строки и присвоение различным переменным в оболочке korn - PullRequest
0 голосов
/ 16 мая 2018

Я экспортирую результат из запроса SQL в виде строки, разделенной запятыми, в переменную.Как назначить каждое значение из строки имени переменной и экспортировать.

$SQLOUTPUT_STRING=1,2018-05-16,abc,123

Я хочу присвоить значения из указанной выше строки переменным и экспортировать их

export VAR1=1
export VAR2=2018-05-16
export VAR3=abc
export VAR4=123

Яиспользуя эти переменные в других сценариях, поэтому я не могу назвать их обобщенными, как указано выше, поэтому VAR1, VAR2, VAR3, VAR4 не будут иметь место, это будут разные имена.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

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

Чтобы показать, что это решение обрабатываетвстроенный пробел, мы начнем с измененной версии вашей примерной строки:

$ input="1,2018-05-16,abc def,asdf 123"

Теперь мы скажем read использовать запятую в качестве разделителя полей ввода (IFS), и мы будемиспользуйте здесь-строку для передачи ${input} в read, что дает нам:

$ IFS=, read -r VAR1 VAR2 VAR3 VAR4 <<< "${input}"

$ echo "${VAR1}"
1

$ echo "${VAR2}"
2018-05-16

$ echo "${VAR3}"
abc def

$ echo "${VAR4}"
asdf 123

Это должно быть немного быстрее, чем мой предыдущий ответ (ниже), основанный на подстановке параметров * плюс *, который вы используетеНе уничтожайте содержимое ${input}.

Вот bash fiddle для вышеуказанного решения и ksh93 fiddle , показывающее то же решение.


Мой предыдущий ответ / разговоры ...

Если вы можете работать с массивами, запустите поиск по "bash split string to array", и вы должны получить несколько SO хитов, чтобы выручить вас.

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

${variable%%,*}      # strip off the first field of a comma-delimited string
${variable#*,}       # strip off fields 2-n of a comma-delimeted string

Применяя это к вашему примеру строки, мы получаем:

$ input="1,2018-05-16,abc,123"

$ VAR1="${input%%,*}"    input="${input#*,}"
$ VAR2="${input%%,*}"    input="${input#*,}"
$ VAR3="${input%%,*}"    input="${input#*,}"
$ VAR4="${input%%,*}"    input="${input#*,}"

$ echo "${VAR1}"
1

$ echo "${VAR2}"
2018-05-16

$ echo "${VAR3}"
abc

$ echo "${VAR4}"
123
  • каждый последующий VAR= / input=пара помещает ведущее поле в VAR и обновляет input, чтобы содержать оставшиеся поля
  • , если вам нужно сохранить исходное значение в input, затем начните с копирования input в другую переменную, которую выможет разбиться на части

Хотя это может показаться немного большим количеством программирования, чем, скажем, использование cut или awk для удаления полей, ключевое преимущество в том, что вам не нужно порождатьновый подпроцесс (как вы делаете для решений cut и awk), поэтому вы должны обнаружить, что производительность улучшается (и повышение производительности должно быть весьма заметно при больших объемах обработки входной строки).

Очевидно (?) Это может немного усложниться, если вы имеете дело с данными, которые а) содержат запятые, б) охватывают несколько строк и / или в) содержат непечатный / контрольный символRS ...

0 голосов
/ 17 мая 2018

Вы можете использовать команду cut в сценариях оболочки, чтобы получить отдельные поля или целые столбцы файла CSV, по одному на вызов команды cut.cut ожидает, что входные данные CSV будут предоставлены через стандартный ввод, поэтому вы можете использовать функцию оболочки «здесь» для представления содержимого вашей переменной оболочки SQLOUTPUT_STRING как stdin.

Следующая последовательностькоманды будут присваивать значения 1, 2018-05-16, abc и 123 от VAR1 до VAR2 соответственно:

SQLOUTPUT_STRING=1,2018-05-16,abc,123

export VAR1=`cut -d, -f1 <<
$SQLOUTPUT_STRING
EOF
`
export VAR2=`cut -d, -f2 <<
$SQLOUTPUT_STRING
EOF
`
export VAR3=`cut -d, -f3 <<
$SQLOUTPUT_STRING
EOF
`
export VAR4=`cut -d, -f4 <<
$SQLOUTPUT_STRING
EOF
`

Примечание. Я использовал традиционную обратную связь оболочки Борнаэкранирует, чтобы оболочка выполнила команду, заключенную в обратные кавычки, и использовала ее вывод в качестве буквального значения замены для расширения на месте в операторе export, поскольку вы специально запросили переносимый код оболочки.В современном синтаксисе оболочки ksh могут существовать альтернативные операторы синтаксиса и перенаправления.

...