当写为单行时,循环中的var = $((var + 1))不起作用(仅!)

时间:2016-07-10 00:03:09

标签: bash

我尝试了几种使用bash命令在for循环中递增的方法。每次$ VAR通过循环时它都会重置。我使用let和不使用let添加了两者的输出。我不确定为什么不使用let不起作用,但它没有?

我的代码写得如下:

echo "Initial value: $VAR"
for file in a b c; do
  VAR=$((VAR+1))
  echo "Incremented"
done
echo "Final value: $VAR"

但它不能像这样工作:

echo "Initial value: $VAR"
for file in a b c; do VAR=$((VAR+1)) echo "Incremented"; done
echo "Final value: $VAR"

同样,当我使用let

时,它也有效
for file in a b c; do let VAR++; echo "Incremented"; done

有什么区别?

1 个答案:

答案 0 :(得分:2)

问题实际上在于你如何将事情分解成单行。您的代码等同于:

for file in *.dat; do
  printf "$file "
  if grep -q 'hit' "$file"; then
    HITS=$((HITS+1))
    echo "hit"
  else
    MISSES=$((MISSES+1)) echo "miss"
  fi
done

了解具体如何

MISSES=$((MISSES+1)) echo "miss"

...所有在一条线上?这是你的错误。添加分号或换行符:

MISSES=$((MISSES+1)); echo "miss"

...前一版本在MISSES命令的持续时间内在环境中导出echo的新值,但不会在该范围之外更改它;后者实际上更新了它。