79

Существует ли в Linux Баш нечто похожее на следующий код в PHP:Linux Баш: Multiple присвоение переменной

list($var1, $var2, $var3) = function_that_returns_a_three_element_array() ; 

т.е. вы назначаете в одном предложении соответствующее значение для 3-х различных переменных.

Предположим, у меня есть функция bash myBashFuntion, которая записывает в stdout строку «qwert asdfg zxcvb». Можно ли сделать что-то вроде:

(var1 var2 var3) = (`myBashFuntion param1 param2`) 

Часть, слева от знака равенства не является допустимым синтаксисом, конечно. Я просто пытаюсь объяснить, о чем я прошу.

Что действительно работает, однако, является следующее:

array = (`myBashFuntion param1 param2`) 
echo ${array[0]} ${array[1]} ${array[2]} 

Но индексированный массив не как описательный, как простые имена переменных.
Однако, я просто не мог сделать:

var1 = ${array[0]} ; var2 = ${array[1]} ; var3 = ${array[2]} 

Но это еще 3 заявления, что я предпочел бы избежать.

Я просто ищу синтаксис ярлыка. Является ли это возможным?

ответ

152

Первое, что приходит мне в голову:

read -r a b c <<<$(echo 1 2 3) ; echo "$a|$b|$c" 

выход, что не удивительно

1|2|3 
+0

Почему я не думал об этом раньше. Спасибо – GetFree

+1

Спасибо очень просто и interisting. – pharaoh

+0

Это то, что я ищу, люблю так много, ;-) – Alcott

0

Глава 5 Bash Cookbook от O'Reilly, обсуждает (в какой-то длины) причины для требование в переменном назначении, чтобы не было пробелов вокруг знака «=»

MYVAR="something" 

Объяснение имеет какое-то отношение к различию между именем команды и переменной (где «=» может быть допустимым аргументом).

Все это кажется немного оправданным после события, но в любом случае нет упоминания о методе назначения списка переменных.

+0

Да, я знаю. Я просто добавил дополнительные пробелы здесь и там ради удобочитаемости – GetFree

+0

Да, это правда: readbiity действительно страдает скриптами bash. – pavium

4

Я думаю, что это могло бы помочь ...

Для того, чтобы сломать пользователь введенные даты (мм/дд/гггг) в моем сценарии, я храню день, месяц и год в массив, а затем поместите значения в отдельные переменные следующим образом:

DATE_ARRAY=(`echo $2 | sed -e 's/\// /g'`) 
MONTH=(`echo ${DATE_ARRAY[0]}`) 
DAY=(`echo ${DATE_ARRAY[1]}`) 
YEAR=(`echo ${DATE_ARRAY[2]}`) 
3

Иногда вам приходится делать что-то фанки. Предположим, вы хотите прочитать из команды (пример даты, например, SDGuero), но вы хотите избежать нескольких вилок.

read month day year << DATE_COMMAND 
$(date "+%m %d %Y") 
DATE_COMMAND 
echo $month $day $year 

Вы могли бы также трубы в команду чтения, но тогда вам придется использовать переменные в субоболочке:

day=n/a; month=n/a; year=n/a 
date "+%d %m %Y" | { read day month year ; echo $day $month $year; } 
echo $day $month $year 

приводит ...

13 08 2013 
n/a n/a n/a 
+0

Команда 'read' не выполняется в подоболочке из-за скобок, потому что у вас есть команда чтения на правой стороне трубы. Вам нужно запустить команду 'read' в текущей оболочке, которую вы можете сделать как' read day month year <<< \ 'date '+% d% m% Y" \ '' – pneumatics

+0

Нет - 'read' _happens_, но объем переменных, которые он считывает, выпадает из области действия, когда заканчивается подоболочка конвейера. – Otheus

+0

Мой комментарий был о причине _why_ чтение происходит в подоболочке, и я понимаю, что теперь я неправильно понял, что вы написали. Я думал, вы имели в виду, что подоболочка была создана, потому что вы использовали фигурные скобки вокруг составного оператора. Но! Причина, по которой вы приводили этот пример, заключалась в том, чтобы избежать разветвления, но не будет ли вилка подсечки тоже? – pneumatics

12

Я хотел присвоить значения массиву. Таким образом, расширяя подход Майкла Krelin, я сделал:

read a[{1..3}] <<< $(echo 2 4 6); echo "${a[1]}|${a[2]}|${a[3]}" 

, который дает:

2|4|6 

, как и ожидалось.

+2

Чтобы поместить значения в массив, есть уже простое решение, которое я упомянул в вопросе: 'a = ($ (echo 2 4 6)); echo $ {a [0]} $ {a [1]} $ {a [2]} ' – GetFree

+0

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

+0

@soundray Ваше решение использует расширение и herestring, bash, что я сомневаюсь, что он будет хорошо работать в этом сценарии (но я не проверял). –

Смежные вопросы