Вы можете сделать это с помощью eval
testFunction () {
eval 'read -p "Enter Y or N: " '$1
eval 'echo $'$1
}
testFunction foo
Но eval
не является инструментом, который следует использовать легкомысленно. То, что ты делаешь, вероятно, сумасшедшее. Вы должны использовать такой подход
testFunction () {
read -p "Enter Y or N: " bar
case "$bar" in
[YyNn]) return 0 ;;
esac
return 1
}
testFunction && foo=valid
Таким образом, вам не нужно перепроверять $foo
позже, его значение является ответом на вопрос «Был ли ввод действительным?»
Но, может быть, позже вы захотите сделать что-то другое, основываясь на том, сказал ли пользователь y
или n
, что, как я подозреваю, и является причиной бессмысленности «давайте динамически создадим переменную из функции». В этом случае вы можете сделать что-то вроде
testFunction () {
read -p "Enter Yes or No: " bar
case "$bar" in
[Yy][Ee][Ss]|[Yy]) printf y ;;
[Nn][Oo]|[Nn]) printf n ;;
esac
}
foo=$(testFunction)
Это функционально аналогично версии eval
, но гарантирует, что вы получаете только известные значения в foo
. Позже вы можете проверить значение в foo
.
if [ -z "$foo" ] ; then
echo invalid input
elif [ "$foo" = "y" ] ; then
echo answered yes
elif [ "$foo" = "n" ] ; then
echo answered no
fi
И вы можете сохранить этот код простым, потому что все возможные значения уже известны.