Existe no linux bash algo semelhante ao seguinte código em PHP:
list($var1, $var2, $var3) = function_that_returns_a_three_element_array() ;
ou seja, você atribui em uma frase um valor correspondente a 3 variáveis diferentes.
Digamos que eu tenha a função bash myBashFuntion
que grava em 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 uma matriz indexada não é tão descritiva quanto nomes de variáveis simples.
No entanto, eu poderia apenas fazer:
var1 = ${array[0]} ; var2 = ${array[1]} ; var3 = ${array[2]}
Mas essas são mais 3 afirmações que prefiro evitar.
Estou apenas procurando uma sintaxe de atalho. É possível?
linux
bash
shell
variable-assignment
multiple-variable-return
Liberta-te
fonte
fonte
read -d "\n" v1 v2 <<<$(cmd)
funciona perfeitamente. Obrigado!echo
tem sentido, mas eu estava usando essa técnica para retornar vários valores de um script que me preocupava com o status de retorno. Pensei em compartilhar minhas descobertas.read -r
:do not allow backslashes to escape any characters
Eu queria atribuir os valores a uma matriz. Então, estendendo a abordagem de Michael Krelin , eu fiz:
que produz:
como esperado.
fonte
a=( $(echo 2 4 6) ) ; echo ${a[0]} ${a[1]} ${a[2]}
read -r
:do not allow backslashes to escape any characters
Acho que isso pode ajudar ...
Para decompor as datas inseridas pelo usuário (mm / dd / 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 da seguinte maneira:
fonte
IFS=/ read -r m d y < <(echo 12/29/2009)
Às vezes você precisa fazer algo estranho. Digamos que você queira ler um comando (o exemplo de data do SDGuero, por exemplo), mas deseja evitar múltiplos garfos.
Você também poderia canalizar para o comando read, mas então teria que usar as variáveis dentro de um subshell:
resulta em...
fonte
read
comando não acontece em um subshell por causa das chaves, é porque você tem o comando read no lado direito do tubo. Você precisa executar oread
comando no shell atual, o que você pode fazer comoread day month year <<< `date "+%d %m %Y"`
read
acontece, mas o escopo das variáveis que ele lê sai do escopo quando o subshell do pipeline termina.O Capítulo 5 do Bash Cookbook de O'Reilly discute (com alguma 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 '='
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 como uma justificativa após o evento, mas em qualquer caso, não há menção de um método de atribuição a uma lista de variáveis.
fonte
;
" for um argumento válido? Quando escrevols ; cd
ainda chamals
ecd
apesar dos espaços. Se eu quiser listar diretórios chamados;
ecd
posso apenas digitarls ';' cd
.