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?

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)

4

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

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

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}')

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)%%.*}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.