Bash 变量在内部循环后为空
我的bash脚本有问题Bash 变量在内部循环后为空,bash,variables,Bash,Variables,我的bash脚本有问题 t='Hostname\cfg;' echo "Header" > $DST for i in * do t="$i;" egrep -v "(^$|^#)" $IPLIST | while read ii do if grep -q "$ii" $i then t=$t"y;"
t='Hostname\cfg;'
echo "Header" > $DST
for i in *
do
t="$i;"
egrep -v "(^$|^#)" $IPLIST | while read ii
do
if grep -q "$ii" $i
then
t=$t"y;"
else
t=$t"n;"
fi
echo "$t"
done
echo "x$t"
n=$(($n + 1))
echo "$n"
#echo "$ii;$t" # >> $DST
#t=""
done
生成以下输出:
h0010001.conf;y;
h0010001.conf;y;y;
<ommited>
h0010001.conf;y;y;y;y;y;y;y;y;y;y;y;y;y;y;y;y;y;y;y;y;n;n;y;y;y;y;y;y;y;y;y;y;y;y;n;y;y;y;y;y;y;n;y;y;y;y;y;y;y;y;y;n;n;
xh0010001.conf;
h0010001.conf;Y
h0010001.conf;YY
h0010001.conf;YYYYYYYYYYYYYYYYYYYYNNYYYYYYYYYYYYNYYYYYYNYYYYYYYYYNN
xh0010001.conf;
因此,由于某种原因,t变量在内部循环完成后为空。
我想要实现的是,在第二个循环之后将t-写入一个文件。@Barmar是正确的。这里有一个典型的解决方法 将while循环更改为在父shell中运行:
while read ii
do
if grep -q "$ii" $i
then
t=$t"y;"
else
t=$t"n;"
fi
echo "$t"
done < <(egrep -v "(^$|^#)" $IPLIST)
在读ii时
做
如果grep-q“$ii”$i
然后
t=$t“y
其他的
t=$t“n
fi
回声“$t”
完成了<@Barmar很在行。这里有一个典型的解决方法
将while循环更改为在父shell中运行:
while read ii
do
if grep -q "$ii" $i
then
t=$t"y;"
else
t=$t"n;"
fi
echo "$t"
done < <(egrep -v "(^$|^#)" $IPLIST)
在读ii时
做
如果grep-q“$ii”$i
然后
t=$t“y
其他的
t=$t“n
fi
回声“$t”
done<管道中的命令在子shell中执行,因此变量赋值不会影响原始shell。管道中的命令在子shell中执行,因此变量赋值不会影响原始shell。不过,外部的egrep
是完全无用的。@gniourf_gniourf这对问题无关紧要,但是是的,这里有很多我会写的不同的东西,事实上它们之间有某种关联,因为如果OP没有使用这个egrep
,并且直接使用globs进行过滤,这个问题就永远不会出现!他在问为什么他的变量“不稳定”。他可以通过许多(不相关的)方式避免出现问题。虽然外部的egrep
是完全无用的。@gniourf_gniourf这对问题无关紧要,但是的,这里有很多我会写的不同的东西,事实上它是有某种关联的,因为如果OP没有使用这个egrep
,并且直接使用globs进行过滤,这个问题就永远不会出现!他在问为什么他的变量“不稳定”。他可以通过许多(不相关的)方式避免出现问题。