2

我正在尝试定义一个 bash 函数,它返回一个递增的 id,我可以使用 bash 替换直接访问它:

#!/bin/bash

getId() {
        echo "$x"
        x=$((x+1))
}

x=0
echo "id1: $(getId)"
echo "id2: $(getId)"

但是变量没有增加,我不知道为什么。

id1: 0
id2: 0

请问,有人对这种行为有解释吗?

4

3 回答 3

2
getId() {
  echo "$x"
  ((x++))
}
x=0
echo -n "id1: "
getId
echo -n "id2: "
getId

输出:

id1: 0
id2: 1
于 2015-04-16T17:09:31.867 回答
1

不妨让它通用:

incr() { (( $1 += ${2:-1} )); }

例子:

incr x   ; echo $x  # => 1
incr x   ; echo $x  # => 2
incr x  4; echo $x  # => 6
incr x -2; echo $x  # => 4
于 2015-04-16T18:30:47.823 回答
1

我知道没有简单的方法可以使用您拥有的语法(在 echo 行中)在子 shell 调用中执行此操作。

一个替代方案是:

#!/bin/bash

export x=0

incId() {
        #echo "$x"
        (( x += 1))
}

incId
echo "id1: $x"
incId
echo "id2: $x"

但是在这里,您需要通过外线incId函数调用来增加 id。

它也从 1 开始计数,而不是 0。

使用letshell 命令也是做数学的更好方法。

使用(( ... ))进行 shell 算术的正确方法

于 2015-04-16T17:10:08.010 回答