Ich habe so etwas:
declare -a DISPLAYS
AUXILIAR="$(xrandr | grep " connected ")"
IFS=$'\n' read -ra DISPLAYS <<< "$AUXILIAR"
Warum werden Zeilenumbrüche nicht erkannt, wenn
echo "$AUXILIAR"
Mehr als eine Zeile drucken?
AKTUALISIEREN
Diese Arbeit beinhaltet:
AUXILIAR="$(xrandr | grep " connected " | tr '\n' '%')"
IFS='%' read -ra DISPLAYS <<< $(echo $AUXILIAR)
Ich möchte immer noch wissen, warum es nicht in Bruchlinien aufgeteilt wurde.
Antwort1
Standardmäßig read
wird nur gelesenjeweils eine Zeile. Hier bieten wir beispielsweisedreiEingabezeilen und read
liest, wie Sie sehen, nur die erste Zeile:
$ IFS=$'\n' read -ra displays <<< $'a\nb\nc\n'; declare -p displays
declare -a displays='([0]="a")'
Mit dieser -d
Option können Sie dieses Verhalten ändern. Beispiel:
$ IFS=$'\n' read -d '' -ra displays <<< $'a\nb\nc\n'; declare -p displays
declare -a displays='([0]="a" [1]="b" [2]="c")
Hier -d ''
wurde verwendet. Dies weist an, read
zu lesen, bis ein NUL-Zeichen gefunden wird. Da in einer Bash-Zeichenfolge niemals ein NUL-Zeichen vorkommen kann, bewirkt dies, dass alle Eingaben gelesen werden, die wir mit der Here-Zeichenfolge bereitstellen.
% verwenden
$ IFS=% read -ra displays <<< 'a%b%c'; declare -p displays
declare -a displays='([0]="a" [1]="b" [2]="c")'
Die Verwendung %
funktioniert, weil read
das Lesen über hinaus fortgesetzt wird %
. Standardmäßig wird nur bei Zeilenumbruchzeichen angehalten.
Andere
Es gilt als bewährte Vorgehensweise, für Ihre Variablen Kleinbuchstaben oder gemischte Groß- und Kleinschreibung zu verwenden. Das System verwendet Namen in Großbuchstaben und Sie möchten nicht versehentlich einen davon überschreiben. Beispielsweise handelt es DISPLAY
sich um eine Systemvariable und das Überschreiben könnte viele unangenehme Probleme verursachen.