Führen Sie einen Befehl und dann die Parametersubstitution in einer Zeile aus

7
bash# hostname
host1.example.com

Ich möchte nur host1. Damit:

SHORT_HOST=$(/bin/hostname)
SHORT_HOST=${SHORT_HOST%%.*}

Kann ich daraus einen Einzeiler machen? - oder - was ist der beste Weg, um $ SHORT_HOST schreibgeschützt zu machen und trotzdem den kurzen Hostnamen zu erhalten?

Felipe Alvarez
quelle

Antworten:

5

Wenn Sie sich nicht nur auf die Tools von bash beschränken, versuchen Sie es vielleicht

SHORT_HOST=$(hostname | sed -e 's/\..*//')

oder

SHORT_HOST=$(hostname | cut -d. -f1)
Ulrich Schwarz
quelle
4

Wenn Ihre Umgebung dies unterstützt, können Sie einfach:

typeset -r SHORT_HOST="$(/bin/hostname -s)"
Matte
quelle
3

Dies ist nur eine andere Möglichkeit, den awkBefehl zu verwenden:

/bin/hostname | awk -F'.' '{print $1}'

Wenn Sie es in einer SHORT_HOST-Variablen speichern müssen, verwenden Sie Folgendes:

SHORT_HOST=$(/bin/hostname | awk -F'.' '{print $1}')
ztank1013
quelle
2

In anderen Shells als zsh müssen Sie eine Zwischenzuweisung ausführen, wenn Sie mehrere Transformationen für einen Wert ausführen möchten.

Natürlich gibt es manchmal Problemumgehungen, z. B. das Ausführen eines Befehls, der das gewünschte Ergebnis ohne Nachbearbeitung erzielt, oder das Nachbearbeiten über ein Rohr über ein externes Tool (die Rohrlösung ist langsamer und birgt ein höheres Risiko, Zeilenumbrüche zu beschädigen).

Wenn Sie die Variable schreibgeschützt machen möchten, ist es möglicherweise sauberer, sie einer temporären Variablen zuzuweisen.

tmp=$(/bin/hostname)
typeset -r SHORT_HOST="${tmp%%.*}"

Zsh (aber nicht ksh oder bash) unterstützt verschachtelte Parametersubstitutionen. Dort kannst du schreiben

typeset -r SHORT_HOST=${$(/bin/hostname)%%.*}
Gilles 'SO - hör auf böse zu sein'
quelle