Eu preciso fazer IFS=",";echo {1..5}
para que ele possa produzir 1,2,3,4,5
em vez de 1 2 3 4 5
. Como faço bash echo {1..5} e produzo os valores com uma vírgula?
relate perguntas
-
Como acessar mais membros de uma matriz ao usar a indireção da variável bash?
-
-q dentro da atribuição de Makefile
-
ls discrepância - encontrado vs não encontrado (nenhum arquivo ou diretório) - no mesmo arquivo [fechado]
-
Expandir uma variável cujo valor contém uma opção e um nome de caminho com espaços em branco
-
Como fazer uma frase expansível especial no bash?
Tente usar:
Com os recursos internos do Bash:
Isso é um pouco feio, pois precisamos separar o
5
para evitar uma vírgula à direita:Embora desde que
printf
possa produzir diretamente para uma variável, isso pode ser contornado e a vírgula final removida com uma expansão de parâmetro:Ou com
"$*"
, que une usando o primeiro caractere deIFS
. Isso destrói o estado global, mas você pode evitar isso facilmente executando-o em um subshell ou em uma função comlocal IFS
:Se os limites estiverem em variáveis, provavelmente é mais fácil fazer isso manualmente com um loop, pois você não pode usar variáveis como pontos de extremidade em um intervalo de expansão de chaves. Novamente, o limite superior está em um caso especial:
Isso é mais para expandir ainda mais a expansão do que para fornecer uma solução prática: o que se segue é menos conciso e eficiente do que as alternativas propostas em outras respostas.
No Bash, o Separador de Campo Interno (
IFS
) não é usado para expansão de chaves - portanto,IFS=","; echo {1..5}
não funcionará como você gostaria. Ele é usado, no entanto, ao expandir algumas outras coisas, incluindo:Parâmetros posicionais
Sobre a expansão do parâmetro especial
*
, citandoman bash
:Podemos usar uma função para exemplificar:
Observe que essa função também define o valor de
IFS
para o ambiente de chamada. Isso pode ser evitado de uma maneira portátil colocando o corpo da função entre parênteses (ou sejafnc () ( IFS=... )
), com o efeito colateral de executá-lo em um subshell, ou usandolocal IFS=,
para declarar uma variável que é local para a função (olocal
builtin não é especificado em POSIX, mas está disponível em vários shells), ouIFS
retornando ao seu valor original antes do final da função.Matrizes
Ao acessar os itens de um array usando o
*
subscrito, novamente, citandoman bash
:Exemplo (novamente, não se esqueça de definir de
IFS
volta para um valor adequado):Se você permitir espaços junto com vírgulas, tente
Como você está usando a expansão de chaves numéricas, os únicos espaços que aparecerão são aqueles entre os números, para que você possa pós-processar o resultado:
ou