2015-04-16 7 views
2

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

#!/bin/bash 

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

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

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

id1: 0 
id2: 0 

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

+3

Каждый '$()' является суб-оболочки, так присвоений в родительской оболочке не происходит. –

+0

Ответ [здесь] (http://unix.stackexchange.com/a/124904/67134) может быть полезен здесь, но я не уверен в этом. –

+0

Я также думал, что это вызов подкласса, но я не могу установить его с помощью strace. Тем не менее, результат является абсолютно одинаковым. Благодарю. – user3149355

ответ

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

Выход:

 
id1: 0 
id2: 1 
+0

Вместо использования глобальной переменной вы можете передать имя переменной: 'getId() {(($ 1 ++)); }; getId x; getId x' –

+0

@ user3149355, возвращаемое значение, если функция только от 0 до 255. Не очень полезно. –

1

Там нет простой способ я знаю, чтобы сделать это в вызове суб-оболочки с использованием синтаксиса у вас есть (в эхо-линии).

Альтернативным будет:

#!/bin/bash 

export x=0 

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

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

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

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

Использование команды let оболочки это лучший способ сделать математику тоже.

Использование ((...)) является right way to do shell arithmetic

+0

Спасибо, вы подтверждаете, что я не creazy и не могу сделать это в однолинейном звонке. (и спасибо за команду let) – user3149355

+0

'let' - это устаревший способ сделать математику; '$ ((...))' является частью стандарта POSIX. – chepner

+0

@chepner - спасибо за обновление, я редактирую. – StackMonkey

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