festa Linux:Atribuição de múltiplas variáveis
-
21-09-2019 - |
Pergunta
Existe no linux bash algo semelhante ao seguinte código em PHP:
list($var1, $var2, $var3) = function_that_returns_a_three_element_array() ;
ou sejavocê atribui em uma frase um valor correspondente a 3 variáveis diferentes.
Digamos que eu tenha a função bash myBashFuntion
que grava no stdout a string "qwert asdfg zxcvb".É possível fazer algo como:
(var1 var2 var3) = ( `myBashFuntion param1 param2` )
A parte à esquerda do sinal de igual não é uma sintaxe válida, é claro.Só estou tentando explicar o que estou pedindo.
O que funciona, porém, é o seguinte:
array = ( `myBashFuntion param1 param2` )
echo ${array[0]} ${array[1]} ${array[2]}
Mas um array indexado não é tão descritivo quanto nomes simples de variáveis.
No entanto, eu poderia apenas fazer:
var1 = ${array[0]} ; var2 = ${array[1]} ; var3 = ${array[2]}
Mas essas são mais três afirmações que prefiro evitar.
Estou apenas procurando uma sintaxe de atalho.É possível?
Solução
A primeira coisa que me vem à cabeça:
read -r a b c <<<$(echo 1 2 3) ; echo "$a|$b|$c"
a saída é, sem surpresa
1|2|3
Outras dicas
Eu queria atribuir os valores a um array.Então, estendendo A abordagem de Michael Krelin, Eu fiz:
read a[{1..3}] <<< $(echo 2 4 6); echo "${a[1]}|${a[2]}|${a[3]}"
que produz:
2|4|6
como esperado.
Acho que isso pode ajudar...
Para dividir as datas inseridas pelo usuário (dd/mm/aaaa) em meus scripts, armazeno o dia, o mês e o ano em uma matriz e, em seguida, coloco os valores em variáveis separadas, como segue:
DATE_ARRAY=(`echo $2 | sed -e 's/\// /g'`)
MONTH=(`echo ${DATE_ARRAY[0]}`)
DAY=(`echo ${DATE_ARRAY[1]}`)
YEAR=(`echo ${DATE_ARRAY[2]}`)
Às vezes você tem que fazer algo estranho.Digamos que você queira ler um comando (o exemplo de data do SDGuero, por exemplo), mas deseja evitar múltiplas bifurcações.
read month day year << DATE_COMMAND
$(date "+%m %d %Y")
DATE_COMMAND
echo $month $day $year
Você também pode inserir o comando read, mas precisará usar as variáveis dentro de um subshell:
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
resulta em...
13 08 2013
n/a n/a n/a
Capítulo 5 do Livro de receitas do Bash por O'Reilly, discute (com certa extensão) as razões para a exigência em uma atribuição de variável de que não haja espaços ao redor do sinal '='
MYVAR="something"
A explicação tem a ver com a distinção entre o nome de um comando e uma variável (onde '=' pode ser um argumento válido).
Tudo isso parece um pouco com uma justificativa após o evento, mas em qualquer caso não há menção a um método de atribuição a uma lista de variáveis.