我很好奇为什么变量“nameExists”的赋值在以下代码中无法正常工作:
nameExists=1
cat $dataFile | while read line
do
lineName=${line%%:*}
if [ "$lineName" == "$name" ]
then
echo "The entry you are trying to add already exists!"
nameExists=0
break
fi
done
if [ $nameExists -eq 1 ]
then
echo "Append here."
fi
我发现,无论我是否达到内部赋值“nameExists = 0”,$ nameExists的值始终为1.我想知道这是否因为do循环中的nameExists变量被认为是本地的变量。如果是这样,我将如何声明nameExists变量或分配给nameExists变量,使得值0在分配后仍然存在。
答案 0 :(得分:0)
我的问题的答案相对简单,并从这里的文章中收集:http://mywiki.wooledge.org/BashFAQ/024
通过管道命令引入新的SubShell,
cat $dataFile |
我随后介绍了一个特定于Subshell的新变量上下文和环境。因此,我的赋值“nameExists = 0”在循环内局部限定,并且一旦Subshell完成执行就不会持久化。我通过删除不必要的管道解决了这个问题。我生成的代码按预期工作,如下所示。
nameExists=1
while read -r line
do
lineName=${line%%:*}
if [ "$lineName" == "$name" ]
then
echo "The entry you are trying to add already exists!"
nameExists=0
break
fi
done < $dataFile
if [ $nameExists -eq 1 ]
then
echo "Append here."
fi