Ich habe eine mehrzeilige Variable und möchte nur die erste Zeile in dieser Variablen. Das folgende Skript veranschaulicht das Problem:
#!/bin/bash
STRINGTEST="Onlygetthefirstline
butnotthesecond
orthethird"
echo " Take the first line and send to standard output:"
echo ${STRINGTEST%%$'\n'*}
# Output is as follows:
# Onlygetthefirstline
echo " Set the value of the variable to the first line of the variable:"
STRINGTEST=${STRINGTEST%%$'\n'*}
echo " Send the modified variable to standard output:"
echo $STRINGTEST
# Output is as follows:
# Onlygetthefirstline butnotthesecond orthethird
Frage: Warum wird ${STRINGTEST%%$'\n'*}
die erste Zeile zurückgegeben, wenn sie nach einem echo
Befehl platziert wird, aber Zeilenumbrüche werden durch Leerzeichen ersetzt, wenn sie nach der Zuweisung platziert werden?
$'...'
anstelle von Bash keine Unterstützung bietet .Antworten:
Vielleicht gibt es eine andere Möglichkeit, das zu archivieren, was Sie tun möchten, aber das funktioniert
quelle
$STRINGTEST
keine Leerzeichen oder Platzhalter enthalten. Beachten Sie auch, dass leere Zeilen (wie in der ersten Zeile dieser Variablen) ignoriert werden.STRINGTEST=(${STRINGTEST[@]})
wenig Sinn macht und äquivalent zu ist,STRINGTEST=($STRINGTEST)
da sieSTRINGTEST
zuvor als skalare (nicht Array- ) Variable definiert wurde.vielleicht nicht am effizientesten, aber ein Liner ...
quelle
firstLine=`echo "${test_var}" | sed -n 1p
funktioniert auch, wenn Sie einen Grund haben, stattdessen sed zu verwenden (z. B. bedeutet dies, dass Sie gleichzeitig einen Ersatz für die Leitung durchführen können :echo "${test_var}" | sed -nE '1 s/# *(.*)/\1/p'
.Dieser Code funktioniert für mich mit allen Versionen von Bash, die ich zwischen 2.05b und 4.3 ausprobiert habe. Wahrscheinlicher ist, dass Sie versucht haben, dieses Skript mit einer anderen Shell auszuführen, die die
$'...'
Form des Zitierens nicht unterstützt .Das
$'...'
Syntax ist nicht Standard -sh
Syntax (noch) und nur unterstützt (Stand : 2015.05.22 und AFAIK) durchksh93
(wo sie ihren Ursprung)zsh
, diebash
jüngsten Versionenmksh
und diesh
oder neuere Versionen von FreeBSD .Meine Wette wäre, dass Sie versucht, dieses Skript auszuführen mit
sh
stattbash
und Ihrsh
basiert auf Versionenash
,pdksh
,yash
oderksh88
das tun unterstützen es noch nicht.Wenn Sie diesen Code POSIX 2008-kompatibel machen möchten, müssen Sie ihn schreiben:
Dann können Sie es von jeder POSIX-kompatiblen Shell wie
bash
oder von jeder schlankeren / schnelleren wie Ihrer interpretieren lassensh
.(und denken Sie daran, dass das Nicht-Zitieren einer Variablen im Listenkontext in Bourne-ähnlichen Shells eine ganz besondere Bedeutung hat).
quelle
Das funktioniert bei mir:
Und es funktioniert auch für Leerzeilen:
quelle
read
einmal in eine einfache Variable (anstelle derreadarray
Plus-Indizierung).Mit eingebautem Bash
read
und Here-String:Verwenden der POSIX-Parametererweiterung:
quelle