此问题已经在这里有了答案:
我有一个简单的bash脚本,如下所示:
interval=""
cat conf.param|\
while read param
do
item_=$(echo $param|cut -d "=" -f1)
case ${item_} in
interval)
interval=$(echo $param|cut -d "=" -f2)
echo $interval
;;
method)
method=$(echo $param|cut -d "=" -f2)
;;
esac
done
echo "${interval}"
它读取文件的内容并将它们存储在不同的变量中。问题是变量没有在案例段中正确设置。我提出了两个回声。第一个(内部情况)正确显示了间隔值'2',但是esac语句之后的第二个什么也不显示!它显示一个空的空白行。conf.param是一个简单的文本文件。它有更多行,我只打印了两行:
interval=2
method="POST"
[您的问题是,使用管道(“ cat conf.param |而读取参数”),您调用了第二个外壳程序,该外壳程序无法将其变量导出到调用方。参见以下示例:
interval=""
cat tmp.txt | while read param; do ##### DON'T DO THIS
interval="A$interval"
done
echo "First attempt: $interval"
interval=""
while read param; do
interval="A$interval"
done < tmp.txt ##### BUT DO THIS INSTEAD
echo "Redirection attempt: $interval"
文件tmp.txt包含4行;脚本的输出为:
第一次尝试:
重定向尝试:AAAA
如您所见,第一次尝试将保留间隔的旧值。因为没有创建新进程,所以第二次/重定向尝试有效。