Bash变量在管道中不递减

时间:2017-04-21 14:33:40

标签: bash pipeline subshell

第一个例子中的变量x没有减少,而在第二个例子中它可以减少。为什么呢?

非工作示例:

#!/bin/bash

x=100
f() {
  echo $((x--)) | tr 0-9 A-J
  # this also wouldn't work: tr 0-9 A-J <<< $((x--))
  f
}
f

工作示例:

#!/bin/bash

x=100
f() {
  echo $x | tr 0-9 A-J
  ((x--))
  # this also works: a=$((x--))
  f
}
f

我认为它与子壳有关,因为我认为管道中的各个命令都在子壳中运行。

1 个答案:

答案 0 :(得分:0)

如果您不使用管道(并避免子shell分叉),它会减少:

x=10

f() {
   if ((x)); then
      echo $((x--))
      f
   fi
}

然后将其称为:

f

它会打印出来:

10
9
8
7
6
5
4
3
2
1

由于在子shell中发生了递减,因此当前的shell没有看到x的递减值并且进行无限递归。

编辑:您可以尝试以下方法:

x=10

f() {
   if ((x)); then
      x=$(tr 0-9 A-J <<< $x >&2; echo $((--x)))
      f
   fi
}

f

获得此输出:

BA
J
I
H
G
F
E
D
C
B