Как передать возвращаемое значение функции в качестве индекса массива в скрипте bash? - PullRequest
0 голосов
/ 21 февраля 2012

Это моя программа "try.sh":

in=$*
type=(even odd)

echo -e $in " is a " ${type[is_odd $in]} " number."

is_odd()
{
    return `expr $1 % 2`
}

Но если я выполню "./try.sh", она выдаст мне эту ошибку:

./try.sh: line 3: is_odd 2: syntax error in expression (error token is "2")

Я хочувозвращаемое значение функции is_odd () для передачи в качестве индекса в массив с именем "type"

Скажите, пожалуйста, как я могу заставить его работать.Спасибо.

1 Ответ

3 голосов
/ 21 февраля 2012

Вместо того, чтобы is_odd возвращал свой результат в качестве кода состояния, я думаю, что лучше напечатать его результат:

is_odd()
{
    expr $1 % 2
}

Затем вы можете использовать команду-подстановку (`...` или $(...)), чтобы получить результат:

echo -e $in " is an " ${type[$(is_odd $in)]} " number."

Хотя, если честно, в этом конкретном случае я бы просто избавился от функции и использовал арифметическое выражение напрямую & mdash; и, возможно, немного скорректировать кавычки для удобства чтения:

echo -e "$in is an ${type[in % 2]} number."

(Обратите внимание, что двойные кавычки "..." не предотвращают подстановку параметров ${...}. Это делают только одинарные кавычки '...' и обратные косые черты \. Кроме того, хет-кончик к jordanm для указания из-за того, что индексы массива автоматически обрабатываются как арифметические выражения, даже без expr или ((...)) или чего-либо еще.)

Тем не менее, если вы действительно хотите вернуть 1 для "нечетного" и 0 для "четного", то, во-первых, вы должны переименовать свою функцию в is_even (поскольку в Bash 0 означает " Успешные "или" истина "и ненулевые значения означают" ошибка "или" ложь "), и, во-вторых, вы можете использовать следующую команду, чтобы напечатать возвращаемое значение, а затем использовать команду-подстановку. Любой из них должен работать:

echo -e "$in is an ${type[$(is_even $in ; echo $?)]} number."

echo -e "$in is an ${type[$(is_even $in && echo 0 || echo 1)]} number."

(Кстати, я также изменил a на an во всех приведенных выше примерах: в английском языке это "нечетное число", "четное число".)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...