【问题标题】:Why doesn't my variable seem to increment in my bash while loop?为什么我的变量在我的 bash while 循环中似乎没有增加?
【发布时间】:2011-06-30 23:31:06
【问题描述】:

我对 bash 脚本相当陌生。在我的 bash 脚本中,我似乎无法在 while 循环的末尾显示正确的计数变量值。

背景:我有一个相当简单的任务:我想将一个包含文件路径列表的文本文件传递给 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"

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

1
2
3
4
5
# of Correct Paths: 4
# of Incorrect Paths: 1
Total # of Files: 5

相反,我得到:

1
2
3
4
5
# of Correct Paths: 0
# of Incorrect Paths: 0 
Total # of Files: 0

这些变量的值发生了什么变化?谷歌有很多质量有问题的建议,我想我可以通过更多的搜索来让它工作,但简要解释一下我做错了什么会很有帮助。

【问题讨论】:

  • 您可以使用((N++))((incorrect++))(甚至((N+=1)))以获得更简洁的语法。

标签: bash shell variables scripting


【解决方案1】:

这是因为你在管道中使用了无用的cat 命令,导致创建了一个子shell。试试不带cat

while read filename ; do
    N=$((N+1))
    ....
done < file

【讨论】:

  • 谢谢,这解决了我的问题。这是将文件传递给 while 循环的最佳方法吗? (即完成
  • @spadina。好吧,&lt;&lt;&lt;&gt;&gt;&gt; 是 bash 中的基本运算符。在编写 bash 脚本时,您会多次看到它。习惯它会减轻你的“尴尬”。
  • 如果您需要为循环保留子shell,您还可以将更新后的变量写入临时文件。例如:N=`cat /tmp/n`; ((N++)); echo $N &gt; /tmp/n。循环完成后,再次从文件中读回:N=`cat /tmp/n`
【解决方案2】:

或者,如果您出于某种原因想要保留 cat,您可以通过在 cat 指令之前添加以下行来修复您的脚本:

shopt -s lastpipe 

【讨论】:

    【解决方案3】:

    更一般地说,有时您希望通过管道传输命令的输出。下面是一个使用process substitution 对即将被 Git 提交的 JavaScript 文件进行 lint 并计算失败文件数的示例:

    # $@ glob
    git-staged-files() {
      git diff --cached -C -C -z --name-only --relative --diff-filter=ACMRTUXB "$@"
    }
    
    # $@ name
    map() { IFS= read -rd $'\0' "$@"; }
    
    declare -i errs=0
    while map file; do
      echo "Checking $file..."
      git show ":$file"|
      eslint --stdin --stdin-filename "$file" || ((++errs))
    done < <(git-staged-files \*.js)
    
    ((errs)) && echo -en "\e[31m$errs files with errors.\e[00m " >&2 || :
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-23
      • 2018-03-26
      • 2020-01-13
      • 1970-01-01
      • 2021-01-12
      • 1970-01-01
      • 2020-08-05
      • 1970-01-01
      相关资源
      最近更新 更多