Usted debe utilizar printf
en lugar deecho
:
printf "%s\n" "${mtches[@]}"
Si mtches
está vacío, todavía se generaría una línea vacía. Para dar cuenta de eso:
{ [ "${#mtches[@]}" -eq 0 ] || printf '%s\n' "${mtches[@]}"; } > file
En bash
(y también shells POSIX), a menudo usa la matriz de Parámetros Posicionales como en "$@"
lugar de "$*"
, a menos que tenga una razón especial. Eso también es cierto en los shells que admiten matrices regulares, desde man bash - sección Arrays :
Se puede hacer referencia a cualquier elemento de una matriz usando $ {name [subíndice]}. Las llaves son necesarias para evitar conflictos con los operadores de expansión de nombre de archivo del shell. Si el subíndice es '@' o '*', la palabra se expande a todos los miembros del nombre de la matriz. Estos subíndices difieren solo cuando la palabra aparece entre comillas dobles. Si la palabra está entre comillas dobles, $ {name [*]} se expande a una sola palabra con el valor de cada miembro de la matriz separado por el primer carácter de la variable IFS, y $ {name [@]} expande cada elemento de nombre a una palabra separada. Cuando no hay miembros de la matriz, $ {name [@]} se expande a nada. Si la expansión entre comillas dobles ocurre dentro de una palabra, la expansión del primer parámetro se une con la parte inicial de la palabra original, y la expansión del último parámetro se une con la última parte de la palabra original.
Úselo solo "${array[*]}"
cuando desee unir todos los elementos de la matriz a una cadena.
Quieres usar
${mtches[*]}
en su lugar.Cuando lo use
"${mtches[@]}"
, no importa cuál sea el valor de$IFS
, bash dividirá la matriz en múltiples argumentos. Lo que quiere es un argumento único con cada elemento de matriz unido por\n
.${mtches[*]}
logra esto.También como una forma temporal de configuración
$IFS
, puede hacer:Entonces no tiene que molestarse en volver a configurarlo.
fuente
printf
...Utilizando para :
Usando la historia ; tenga en cuenta que esto fallará si sus valores contienen
!
:Usando basename ; tenga en cuenta que esto fallará si sus valores contienen
/
:Usando shuf ; tenga en cuenta que los resultados pueden no aparecer en orden:
fuente
Agradable y legible y no significa meterse con IFS. También significa que puede personalizar el manejo de cada línea.
fuente
echo
que no se puede utilizar para contenido arbitrario y olvidó citar sus variables . StevenPenny ya publicó una versión un poco mejor