为什么我的变量似乎在我的bash循环中增加?

www*_*iam 15 variables bash shell scripting

我是bash脚本的新手.我似乎无法获得我的计数变量的正确值,以便while在我的bash脚本的循环结束时显示.

背景:我有一个相当简单的任务:我想将包含文件路径列表的文本文件传递给bash脚本,让它检查这些文件是否存在,并计算现有/丢失文件的数量.除了计数部分外,我得到了大部分脚本.

N=0
correct=0
incorrect=0
cat $1 | while read filename ; do
    N=$((N+1))
    echo "$N"

    if ! [ -f $filename ]; then

        incorrect=$((incorrect+1))
    else
        correct=$((correct+1))

    fi

done

echo "# of Correct Paths: $correct"
echo "# of Incorrect Paths: $incorrect"
echo "Total # of Files: $N"
Run Code Online (Sandbox Code Playgroud)

如果我有一个包含5个文件的列表,其中4个存在,我希望得到以下输出(注意循环中的echo命令while):

1
2
3
4
5
# of Correct Paths: 4
# of Incorrect Paths: 1
Total # of Files: 5
Run Code Online (Sandbox Code Playgroud)

相反,我得到:

1
2
3
4
5
# of Correct Paths: 0
# of Incorrect Paths: 0 
Total # of Files: 0
Run Code Online (Sandbox Code Playgroud)

这些变量的值发生了什么变化?谷歌提出了许多质量有问题的建议,我想我可以通过更多的搜索来解决这个问题,但对我做错了什么的简要解释会非常有帮助.

kur*_*umi 23

这是因为您正在使用cat带有管道的无用命令,从而导致创建子shell.尝试没有cat:

while read filename ; do
    N=$((N+1))
    ....
done < file
Run Code Online (Sandbox Code Playgroud)

  • +1继续前进,将您的信心提升至100%. (2认同)
  • 如果需要保留循环的子shell,还可以将更新的变量写入临时文件.例如:`N = \`cat/tmp/n \`; ((N ++)); echo $ N>/tmp/n`.循环完成后,再次从文件中读回:`N = \`cat/tmp/n \``. (2认同)