7
bash# hostname
host1.example.com

I only want host1. So:

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

Can I turn this into a one liner? - or - what is the best way to make $SHORT_HOST readonly, but still get the short hostname?

5

If you're not limited to just bash's tools, maybe try

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

or

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

If your environment supports this, you could simply:

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

This is just another way using awk command:

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

and if you need to store it in a SHORT_HOST variable use the following:

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

In shells other than zsh, you need to perform an intermediate assignment whenever you want to perform multiple transformations on a value.

Of course, there are sometimes workarounds, such as running a command that produces the desired result with no postprocessing or doing the postprocessing via a pipe through an external tool (the pipe solution will be slower and runs into more risk of mangling newlines).

If you want to make the variable read-only, you might find it cleaner to assign to a temporary variable.

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

Zsh (but not ksh or bash) supports nested parameter substitutions. There, you can write

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.