我试图将 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':')