2013-05-31 1 views
1

Рассмотрим общую функцию ask(), которая задает пользователю вопрос, читает ввод и сохраняет его в переменной, названной в соответствии с одним из аргументов функции ,Прочитайте ввод, сохраните его в динамически именованной переменной и проверьте, не был ли задан введенный ввод

ask() { 
    local question="$1" 
    local varname="$2" 

    echo "$question" 
    read $varname 
} 

Предположим, я хочу спросить у пользователя, что является его любимца и хранить ответ в переменной с именем $pet. Использование будет выглядеть следующим образом:

ask "What is your favourite pet?" pet 

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

if [ -z "$pet" ]; then 
    pet="foo" 
fi 

Однако имя переменной, я хочу, чтобы проверить, является ли пустым является то, Я перехожу в качестве второго аргумента. Как я могу проверить, пуста ли переменная (названная по значению $varname), содержащая вход пользователя? Решение должно быть как можно более переносимым и стандартным, и должно работать именно в bash и zsh.

+0

Это может оказаться полезным для вас: http://stackoverflow.com/questions/1921279/how-to-get-a-variable-value-if-variable-name-is-stores-as- строка – Noctua

ответ

1

Основываясь на входе до сих пор мне удалось получить удовлетворительное решение.

eval varname_tmp=\$$varname 

if [ -z "$varname_tmp" ]; then 
    eval "$varname=foo" 
fi 
+1

Итак, что не так с моим решением? – jm666

3

В bash ${!varname} дает значение переменной, имя которой является значением $varname, но, насколько я знаю, этот синтаксис не поддерживается zsh. Если вы хотите что-то, что работает в bash и zsh, вам, возможно, придется использовать oldfashioned eval value=\${$varname}, а затем проверить $value. Вы должны использовать это, только если заранее знаете, что значение $varname является именем юридической переменной; в противном случае это небезопасно.

+0

Спасибо за ввод. Это немного сбило с толку! – faviouz

+0

В 'zsh' синтаксис будет' foo = bar; бар = 3; print $ {(P) foo} '. 'eval' должен быть необходим только для полной совместимости с POSIX. – chepner

2

может быть:

ask() { 
     name=$1;shift 
     read -r -p "[email protected] >" var 
     eval "$name='$var'" 
} 

ask pet "What is your favourite pet?" 
pet=${pet:-foo} 

echo "PET: $pet" 

 Смежные вопросы

  • Нет связанных вопросов^_^