变量没有在bash函数中递增

时间:2018-04-21 02:40:13

标签: bash shell

我有这个:

ql_remove_locks(){
  local pid="$$";
  declare -i count=0;
  ql_pid="$pid" ql_node_ls_all | while read line; do
    count=$((count+1));
    echo "count: $count";
    echo "deleting lock: $line";
    rm -rf "$line";
  done;
  echo "quicklock: $count lock(s) removed."
}

我收到了这个输出:

count: 1
deleting lock: /Users/alexamil/.quicklock/locks/a.lock
quicklock: 0 lock(s) removed.

我已经尝试了很多东西,但仍然会记录0:

quicklock: 0 lock(s) removed.

为什么echo语句中的计数为0而不是1?

1 个答案:

答案 0 :(得分:3)

管道中的命令在子shell中运行。 while循环位于子shell中,具有自己的变量副本,并且修改$count并不会传播回父shell。

您可以将管道切换到重定向+流程替换以解决此问题。

while read line; do
  count=$((count+1))
  echo "count: $count"
  echo "deleting lock: $line"
  rm -rf "$line"
done < <(ql_pid="$pid" ql_node_ls_all)

注意:分号是多余的。