在一行中运行命令,然后进行参数替换

在一行中运行命令,然后进行参数替换
bash# hostname
host1.example.com

我只想要主机1。所以:

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

我可以把它变成一个衬垫吗? - 或 - 使 $SHORT_HOST 只读但仍获得短主机名的最佳方法是什么?

答案1

如果您不仅限于 bash 工具,也许可以尝试

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

或者

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

答案2

如果您的环境支持这一点,您可以简单地:

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

答案3

这只是使用awk命令的另一种方式:

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

如果您需要将其存储在 SHORT_HOST 变量中,请使用以下命令:

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

答案4

在 zsh 以外的 shell 中,每当您想要对某个值执行多次转换时,都需要执行中间赋值。

当然,有时也有一些解决方法,例如运行无需后处理即可产生所需结果的命令或者通过管道进行后处理通过外部工具(管道解决方案会更慢,并且会面临更大的破坏换行符的风险)。

如果您想使变量只读,您可能会发现分配给临时变量更干净。

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

Zsh(但不包括 ksh 或 bash)支持嵌套参数替换。在那里,你可以写

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

相关内容