将 grep 的输出分配给变量

将 grep 的输出分配给变量

我试图将 grep 命令的输出分配给 bash 脚本中的变量,但该变量为空。当我运行以下命令时:

el_value=$(grep '<$2>.*<$2>' $1 | sed -e 's/^.*<$2/<$2/' | cut -f2 -d'>'| cut -f1 -d':')
echo "DEBUG: The value of el_value is '$el_value'"

输出是:

DEBUG: The value of el_value is ''

如果我在脚本之外运行 grep 命令(并将变量替换为实际值),我会得到我期望的输出。


这是脚本片段。使用此脚本并添加上面列出的值。

#!/bin/bash

if [ $# -ne 3 ]; then
echo 1>&2 'This script replaces xml element’s value with the one provided as a command parameter \n\n\tUsage: $0 <xml filename> <element name> <new value>'
exit 127
fi

el_value=`grep "<$2>.*<$2>" $1 | sed -e "s/^.*<$2/<$2/" | cut -f2 -d'>'| cut -f1 -d':'`
echo "DEBUG: The value of el_value is '$el_value'"

答案1

尝试:

el_value=$(sed -n "s/.*<$2>\([^:<]*\).*/\1/p" < "$1")

在您的代码中,问题是:

  • 单引号意味着$2它没有扩展
  • 缺少/搜索grep命令中的结束标记。

答案2

我认为这是一个报价问题。在您的grep&sed参数内,$1并且$2由于您的简单引号 ( ') 而不会被解析。试试这个:

el_value=$(grep "<$2>.*<$2>" $1 | sed -e "s/^.*<$2/<$2/" | cut -f2 -d'>'| cut -f1 -d':')

相关内容