Существует ли в linux bash что-то похожее на следующий код в PHP:
list($var1, $var2, $var3) = function_that_returns_a_three_element_array() ;
т.е. вы присваиваете в одном предложении соответствующее значение трем различным переменным.
Скажем, у меня есть функция 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 утверждения, которых я бы предпочел избежать.
Я просто ищу сокращенный синтаксис. Является ли это возможным?
linux
bash
shell
variable-assignment
multiple-variable-return
Получить бесплатно
источник
источник
read -d "\n" v1 v2 <<<$(cmd)
отлично работает. Спасибо!echo
бессмыслен, но я использовал эту технику, чтобы вернуть несколько значений из скрипта, который меня действительно заботил о статусе возврата. Думал поделиться своими выводами.read -r
:do not allow backslashes to escape any characters
Я хотел присвоить значения массиву. Итак, расширяя подход Майкла Крелина , я сделал:
что дает:
как и ожидалось.
источник
a=( $(echo 2 4 6) ) ; echo ${a[0]} ${a[1]} ${a[2]}
read -r
:do not allow backslashes to escape any characters
Думаю, это может помочь ...
Чтобы разбить введенные пользователем даты (мм / дд / гггг) в моих сценариях, я сохраняю день, месяц и год в массиве, а затем помещаю значения в отдельные переменные следующим образом:
источник
IFS=/ read -r m d y < <(echo 12/29/2009)
Иногда приходится делать что-нибудь фанковое. Предположим, вы хотите читать из команды (например, даты SDGuero, например), но вы хотите избежать множественных форков.
Вы также можете передать команду чтения, но тогда вам придется использовать переменные внутри подоболочки:
приводит к ...
источник
read
не выполняется в подоболочке из-за фигурных скобок, это потому, что у вас есть команда чтения в правой части канала. Вам нужно запуститьread
команду в текущей оболочке, что вы можете сделать какread day month year <<< `date "+%d %m %Y"`
read
происходит, но область переменных, в которые он считывает, выходит за пределы области действия, когда подоболочка конвейера заканчивается.В главе 5 « Поваренной книги Bash» О'Рейли обсуждаются (довольно подробно) причины, по которым при присвоении переменной не должно быть пробелов вокруг знака «=».
Объяснение как-то связано с различием между именем команды и переменной (где '=' может быть допустимым аргументом).
Все это выглядит как оправдание после события, но в любом случае нет упоминания о методе присвоения списку переменных.
источник
;
» - верный аргумент? Когда я пишуls ; cd
это до сих пор называетls
и ,cd
несмотря на пробелы. Если я хочу , чтобы список каталогов , называемых;
иcd
я могу только напечататьls ';' cd
.