第一个例子中的变量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
我认为它与子壳有关,因为我认为管道中的各个命令都在子壳中运行。
答案 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