"管道触发两个子进程执行'|'两边的程序;而重定向是在一个进程内执行 这个区别也是在踩了一个坑之后,才发现的。以前还一直以为是一样的。 下面是踩坑的程序: #!/bin/bash INPUT_FILE='word.txt' declare -A RESULT cat $INPUT_FILE | whi ...."

shell 管道与重定向的区别

管道触发两个子进程执行"|"两边的程序;而重定向是在一个进程内执行

这个区别也是在踩了一个坑之后,才发现的。以前还一直以为是一样的。
下面是踩坑的程序:

#!/bin/bash

INPUT_FILE="word.txt"
declare -A RESULT
cat $INPUT_FILE | while read line
do
    for word in $line
    do
        if [ -z "${RESULT[$word]}" ]
        then
            RESULT[$word]=1
        else
            RESULT[$word]=$(echo "${RESULT[$word]} + 1" | bc)
        fi
        echo "$word count = ${RESULT[$word]}"
    done
done

for word in ${!RESULT[@]}
do
    echo "$word : ${RESULT[$word]}"
done

这个脚本是用来统计一个文件中的每个单词的出现次数。上面是用管道来处理输入的。运行脚本是你会发现

echo "$word count = ${RESULT[$word]}"

这行代码的输出是正确的。
但后面的循环输出结果,却是什么也没有输出。也就是说RESULT数组是空的!
后来改成了使用重定向输入,居然就正常了,由此发现了管道和重定向的工作模式是有区别的。

#!/bin/bash

INPUT_FILE="word.txt"
declare -A RESULT
{
while read line 
do
    for word in $line
    do
        if [ -z "${RESULT[$word]}" ]
        then
            RESULT[$word]=1
        else
            RESULT[$word]=$(echo "${RESULT[$word]} + 1" | bc)
        fi
    done
done
} < $INPUT_FILE

for word in ${!RESULT[@]}
do
    echo "$word : ${RESULT[$word]}"
done

0     0     0     0     0    
0 回帖