Вызов подстановки bash, который увеличивает переменную

Я пытаюсь определить функцию bash, возвращающую увеличенный идентификатор, к которому я могу получить доступ напрямую, используя подстановку bash:

#!/bin/bash

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

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

Однако переменная не увеличивается, и я не могу понять, почему.

id1: 0
id2: 0

Пожалуйста, есть ли у кого-нибудь объяснение этому поведению?

3 ответа

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

Выход:

id1: 0
id2: 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

Я не знаю простого способа сделать это в вызове sub-shell, используя ваш синтаксис (в строке echo).

Альтернативой будет:

#!/bin/bash

export x=0

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

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

Но здесь вам нужна линия вне эха incId вызов функции для получения увеличенного идентификатора.

Он также начинает считать с 1, а не с 0.

С использованием let Командная оболочка - лучший способ сделать математику.

С помощью (( ... )) это правильный способ сделать арифметику оболочки

Другие вопросы по тегам