Вызов подстановки 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
Командная оболочка - лучший способ сделать математику.
С помощью (( ... ))
это правильный способ сделать арифметику оболочки