【问题标题】:Extract variables values from command output Bash Shell从命令输出 Bash Shell 中提取变量值
【发布时间】:2018-02-02 02:08:21
【问题描述】:

在 bash shell 中,我有一个打印变量名称和值的命令,例如:

Hello mate this is you variables:
MY_VAR1= this is the value of the first var
MY_VAR2= subvar1=27, subvar2=hello1
Have a good day!

输出中的变量值可以包含=,逗号,;,:..等字符,但我希望在每个变量值的末尾找到新行。
我需要创建一个简短的脚本来读取 MY_VAR1 和 MY_VAR2 的值。
所以我需要最终得到 2 个变量,如下所示:

MY_VAR1 = this is the value of the first var
MY_VAR2 = subvar1=27, subvar2=hello1

我有 CentOS 7 的基本安装,但我无法在该机器上安装额外的东西。
我怎样才能实现它?

【问题讨论】:

  • 不清楚您在这里要做什么。你能用一个实际值的例子来解释更多并告诉我们吗?
  • 刚刚编辑了这个问题,现在有意义,我有一个命令输出(可以看作是一个字符串)一些变量的名称,我必须读取这些值,这些值的变量可以包含特殊字符,如“=”,分隔符是换行符。

标签: bash shell unix terminal centos


【解决方案1】:

我假设变量名称是从行首到 = 符号(排除)的所有内容,并删除了前导和尾随空格(变量名中不能有空格)。

如果你想要的只是打印你显示的输出,你可以使用类似的东西:

while read line; do
    if [[ $line =~ ^[[:blank:]]*([^[:blank:]]+)[[:blank:]]*=(.*)$ ]]; then
        var="${BASH_REMATCH[1]}"
        val="${BASH_REMATCH[2]}"
        echo "$var = $val"
     fi
done < <( my_command )

=~ 运算符是与正则表达式匹配的模式。正则表达式^[[:blank:]]*([^[:blank:]]+)[[:blank:]]*=(.*)$ 使用变量赋值模拟命令的输出行。即使变量名被空格包围,它也匹配。两个子表达式(包含在() 中)被隔离:变量名和值。 BASH_REMATCH 数组包含分别与单元格 1 和 2 中的子表达式匹配的模式。

如果您还想分配变量:

while read line; do
    if [[ $line =~ ^[[:blank:]]*([^[:blank:]]+)[[:blank:]]*=(.*)$ ]]; then
        var="${BASH_REMATCH[1]}"
        val="${BASH_REMATCH[2]}"
        echo "$var = $val"
        declare $var="$val"
     fi
done < <( my_command )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    相关资源
    最近更新 更多