Qual é uma boa maneira de concatenar todos os argumentos de uma função?
O que eu tenho no momento é iterar sobre eles e anexá-los consecutivamente:
func(){
concat=
for arg in "$@"
do
concat=$concat$arg
done
echo $concat
}
Eu gostaria de potencialmente fazer algo como:
another_func() {
echo $(remove_spaces $@)
}
Esta função usa
"$*"
(as aspas duplas são importantes), que se expandirá para uma única string com os valores dos parâmetros posicionais (os argumentos) concatenados com o valor do primeiro caractere de$IFS
como delimitador.Definimos
IFS
como uma string vazia, o que significa"$*"
expandir para todos os argumentos concatenados sem um delimitador.Observe também que protegemos o resto do shell script de adotar o
$IFS
valor alterado colocando-o em um subshell( ... )
em vez do usual{ ... }
.Uma chamada para esta função pode, em outra função, parecer
ou menor, sem realmente chamar a
concat
função:Para excluir todos os espaços em uma lista de argumentos, use
por exemplo,
Teste:
Para uma solução rápida com poucos recursos com uma abordagem baseada em seu segundo exemplo:
Desta forma, você está removendo absolutamente todos os espaços. Mas tenha em mente a abordagem de @kusalananda se você planeja ter argumentos contendo espaços.
No
zsh
shell, você pode usar oj:separator:
sinalizador de expansão de parâmetro para unir os elementos de uma matriz com um separador arbitrário. Então você pode fazer:ou
para concatenar os elementos do array
$argv
aka$@
sem ter que modificar um parâmetro global como$IFS
.Se for apenas para imprimir os argumentos, com shells do tipo Bourne, você sempre pode fazer:
O
printf
builtin debash
ezsh
também pode armazenar o resultado em uma variável com:Com o
fish
shell, você pode usar:(imprime uma linha vazia se
$argv
for uma lista vazia).