首页 > 解决方案 > 我可以通过 bash 参数扩展将 bash 脚本变量设置为命令的输出和所有小写字母吗?

问题描述

我想为命令的输出设置一个 bash 变量并确保它都是小写的。我想保持我的代码尽可能干净,而不是在任何地方管道输出。

这是我之前的:

host=$(hostname -s | tr '[:upper:]' '[:lower:]')

相反,我现在使用两个定义(稍微短一些):

host=$(hostname -s); host=${host,,}

但我想知道是否可以在没有管道到 tr (或其他任何东西)的情况下仅在主机的一个定义中做到这一点。第二行可以进一步合并吗?

编辑:这正是我应该复制/粘贴我的代码的原因。事实上,我确实在我的脚本中有'[:upper:]'and '[:lower:]',但输入错误。

标签: bash

解决方案


如果您有 Bash 4.0(2009 年发布),您可以声明host以便在赋值时自动转换为小写:

declare -l host
host=$(hostname -s)

如果代码在函数中,那么最好尽可能本地化变量,所以

local -l host
host=$(hostname -s)

仅比不小写主机名的代码稍长。

可以同时进行声明和赋值

declare -l host=$(hostname -s)  # BAD CODE

但是Shellcheck会正确地抱怨这掩盖了 的退出状态hostname,因此您无法检测或处理错误。

在这种特殊情况下,如果您使用 Bash 内置HOSTNAME变量而不是外部hostname命令,则可以安全地同时进行声明和赋值:

declare -l host=${HOSTNAME%%.*}

推荐阅读