#!/bin/bash
for ((var=0; var<20; var++))
do
echo " Number is: $(grep 'Multiple_Frame = echo **$var**' 20mrf.txt | wc -l)" >>statisic.txt
done
这个shell程序无法产生正确的结果,这可能是第二个grep命令中返回错误变量的原因。
如何在第二个echo句中grep一个变量?根据var的变化来改变不同的东西?
非常感谢!
答案 0 :(得分:4)
正如其他人所说,问题在于单引号会阻止变量的扩展。但是,使用$()
可以使用双引号:
echo " Number is: $(grep "Multiple_Frame = echo **$var**" 20mrf.txt | wc -l)" >>statisic.txt
虽然我怀疑这样的意思是你的意思:
echo " Number is: $(grep "Multiple_Frame = $var" 20mrf.txt | wc -l)" >>statisic.txt
您还应该知道,grep
可以选择输出计数,以便省略wc
:
echo " Number is: $(grep -c "Multiple_Frame = $var" 20mrf.txt)" >>statisic.txt
答案 1 :(得分:2)
@OP,按照这种方式做的事情效率很低。你在同一个文件上调用grep和wc 20次。只打开一次文件,并在文件内容的1次迭代中获得所需的所有内容。 bash 4.0中的示例
declare -A arr
while read -r line
do
case "$line" in
*"Multiple_Frame ="*)
line=${line#*Multiple_Frame = }
num=${line%% *}
if [ -z ${number_num[$num]} ] ;then
number_num[$num]=1
else
number_num[$num]=$(( number_num[$num]+1 ))
fi
;;
esac
done <"file"
for i in "${!number_num[@]}"
do
echo "Multiple_Frame = $i has ${number_num[$i]} counts"
done
同样,您可以在gawk中使用关联数组来帮助您完成此任务。
gawk '/Multiple_Frame =/{
sub(/.*Multiple_Frame = /,"")
sub(/ .*/,"")
arr["Multiple_Frame = "$0]=arr["Multiple_Frame = "$0]+1
}END{
for(i in arr) print i,arr[i]
}' file
答案 2 :(得分:1)
您必须将每个替换存储在变量中。像这样:
#!/bin/bash
for ((var=0; var < 20; var++))
do
count=`grep "Multiple_Frame = $var" 20mrf.txt | wc -l`
echo " Number is: $count" >> statisic.txt
done
答案 3 :(得分:1)
好的,第二个[原文如此]问题是你在第5行的引用。对$ var的引用永远不会被扩展,因为它包含在单引号中。您可以使用转义双引号('
)替换单引号(\"
)来解决此问题。
第一个[原文如此]问题是你试图在一行中做太多,这会导致嵌套问题引用。将该行分成多个命令,根据需要存储中间结果。是的,它可能会慢一点,但你会节省很多时间来调试和维护它。
交易者的第二定律:如果您必须在优化性能和优化可维护性之间做出选择,请务必选择使代码更易于维护。计算机一直在变快;程序员没有。
答案 4 :(得分:0)
$(...)中的字符串引用单引号('...'
)此引号可防止变量扩展。请改用双引号。在你的情况下:
#!/bin/bash
for ((var=0; var<20; var++))
do
echo " Number is: $(grep 'Multiple_Frame = echo **'"$var"'**' 20mrf.txt | wc -l)" >>statisic.txt
done
请注意,在此示例中,似乎已打开echo
命令的双引号,但您应该注意首先评估$(...)
,并且其中没有双引号。因此,此处的更改是关闭grep
打开双引号的单引号,然后关闭双引号并稍后重新打开单引号。
这个冗长的解释说明了将表达分开的好处,正如其他答案所暗示的那样。