Sie sollten printf
anstelle vonecho
:
printf "%s\n" "${mtches[@]}"
Wenn mtches
leer ist, wird immer noch eine leere Zeile ausgegeben. Um das zu erklären:
{ [ "${#mtches[@]}" -eq 0 ] || printf '%s\n' "${mtches[@]}"; } > file
In bash
(und POSIX - Shells auch), verwenden Sie häufig Positionsparameter Array als "$@"
statt "$*"
, es sei denn , Sie einen besonderen Grund haben. Dies gilt auch für Shells, die reguläre Arrays unterstützen, von man bash - section Arrays :
Auf jedes Element eines Arrays kann mit $ {name [subscript]} verwiesen werden. Die geschweiften Klammern sind erforderlich, um Konflikte mit den Dateinamenerweiterungsoperatoren der Shell zu vermeiden. Wenn der Index '@' oder '*' ist, wird das Wort auf alle Mitglieder des Arraynamens erweitert. Diese Indizes unterscheiden sich nur, wenn das Wort in doppelten Anführungszeichen steht. Wenn das Wort in doppelte Anführungszeichen eingeschlossen ist, wird $ {name [*]} zu einem einzelnen Wort erweitert, wobei der Wert jedes Arraymitglieds durch das erste Zeichen der IFS-Variablen getrennt wird, und $ {name [@]} erweitert jedes Element des Namens zu einem separaten Wort. Wenn es keine Array-Mitglieder gibt, wird $ {name [@]} zu nichts erweitert. Wenn die Erweiterung in doppelten Anführungszeichen innerhalb eines Wortes auftritt, wird die Erweiterung des ersten Parameters mit dem Anfangsteil des ursprünglichen Wortes verbunden, und die Erweiterung des letzten Parameters wird mit dem letzten Teil des ursprünglichen Wortes verbunden.
Verwenden "${array[*]}"
Sie diese Option nur, wenn Sie alle Array-Elemente zu einer Zeichenfolge zusammenfügen möchten.
Sie möchten
${mtches[*]}
stattdessen verwenden.Bei der Verwendung
"${mtches[@]}"
spielt es keine Rolle, wie hoch der Wert$IFS
ist. Bash teilt das Array in mehrere Argumente auf. Was Sie wollen, ist ein einzelnes Argument, bei dem jedes Array-Element durch verknüpft ist\n
.${mtches[*]}
erreicht dies.$IFS
Sie können auch vorübergehend Folgendes tun:Dann müssen Sie sich nicht darum kümmern, es zurückzusetzen.
quelle
printf
...Verwendung für :
Geschichte benutzen ; Beachten Sie, dass dies fehlschlägt, wenn Ihre Werte Folgendes enthalten
!
:Verwenden des Basisnamens ; Beachten Sie, dass dies fehlschlägt, wenn Ihre Werte Folgendes enthalten
/
:Mit shuf ; Beachten Sie, dass die Ergebnisse möglicherweise nicht in der richtigen Reihenfolge angezeigt werden:
quelle
Nett und lesbar und bedeutet nicht, sich mit IFS herumzuschlagen. Dies bedeutet auch, dass Sie die Behandlung jeder Zeile anpassen können.
quelle
echo
die nicht für beliebige Inhalte verwendet werden können und vergessen, Ihre Variablen zu zitieren . Eine etwas bessere Version wurde bereits von StevenPenny