Eu quero escrever uma variável de matriz bash em um arquivo, com cada elemento em uma nova linha. Eu poderia fazer isso com um loop for, mas existe outra maneira (mais limpa) de juntar os elementos \n
?
50
Aqui está uma maneira que utiliza a expansão de parâmetros do bash e sua IFS
variável especial.
$ System=('s1' 's2' 's3' 's4 4 4')
$ ( IFS=$'\n'; echo "${System[*]}" )
Usamos um subshell para evitar a substituição do valor IFS
no ambiente atual. Nesse subshell, modificamos o valor de IFS
para que o primeiro caractere seja uma nova linha (usando $'...'
aspas). Finalmente, usamos a expansão de parâmetros para imprimir o conteúdo da matriz como uma única palavra; cada elemento é separado pelo primeiro caractere de IFS
.
Para capturar em uma variável:
$ var=$( IFS=$'\n'; echo "${System[*]}" )
Se o seu bash for novo o suficiente (4.2 ou posterior), você pode (e deve) ainda usar printf
com a -v
opção:
$ printf -v var "%s\n" "${System[@]}"
Em ambos os casos, talvez você não queira a nova linha final var
. Para removê-lo:
$ var=${var%?} # Remove the final character of var
var=${var%?}
? Esta não é uma expressão regular, portanto.
corresponderá apenas a um caractere de ponto.$ IFS=', ' $ echo ${VAR[*]} first second third $ echo "${VAR[*]}" first,second,third
Você pode usar
printf
para imprimir cada item da matriz em sua própria linha:fonte
ou
ou
ou
ou
ou
ou
ou
é tudo o que posso lembrar até agora.
fonte
As soluções acima são praticamente isso, mas a pergunta original pede a saída para o arquivo:
Notas: 1) 'echo' fornece a nova linha final 2) Se este arquivo for lido novamente pelo bash novamente, então declare -p pode ser a serialização desejada.
fonte
Usando para :
Usando a história ; observe que isso falhará se seus valores contiverem
!
:Usando o basename ; observe que isso falhará se seus valores contiverem
/
:Usando shuf ; observe que os resultados podem não sair em ordem:
fonte
Minha opinião , usando apenas Bash builtins, sem alterar
IFS
:Exemplo
Você também pode usar qualquer separador:
fonte
printf
parece ser a abordagem mais eficiente para criar uma string delimitada a partir de uma matriz:Uma maneira ainda mais simples de fazer isso é:
Exemplo
fonte