Я пишу shell-script для термінала Linux. Я хочу мати можливість вводити змінні в запрошення. Наприклад
test.sh:
test="Monkey in the middle..."
read -p "Enter input: " input
echo $input
вихід:
Enter input: $test
$test
Я хочу, щоб вводити "$ test" під час швидкого сегмента (read-p) сценарію та мати в середині скрипт ехо "Мавпа посередині ...", а не повторити "$ test", як це робиться зараз
Як я буду робити це?
UPDATE:
Використовуючи відповіді, надані мені тут і в ця нитка (велика подяка учасникам та коментаторам!), мені вдалося зібрати цю лінію, яка добре працювала для мене:
newvariable="$(eval echo $input)"
Будьте, порадившись, я вже попередив, що використання eval може становити загрозу безпеці. Майте це на увазі, якщо ви оберете це рішення.
Відповіді:
1 для відповіді № 1Є кілька різних відповідей на це питання.
Якщо ви насправді використовуєте bash
, подивіться на bash(1)
сторінку і читайте Розширення параметра розділ:
Якщо першим символом параметра є знак оклику (
!
), він вводить рівень змінноїнапрями. Баш використовує значення змінної, що утворюється з решти параметра як назва змінної; ця змінна потім розширюється і це значення використовується в решті частини заміщення, а не значення самого параметра. Це відоме як непряме розширення Виключенням з цього є розширення${!prefix*}
і${!name[@]}
описано нижче. Вигук точка повинна відразу ж слідувати лівою стрілкою, щоб ввестинапрямок
Це означає, що у вас є:
read $input
echo "${!input}"
І користувач вводить "HOME
", ви побачите значення $HOME
. Для Наприклад, у моїй системі:
Enter input: HOME
/home/lars
Крім того, ви можете скористатись eval
команда, яка повинна працювати нормально в будь-якому середовищі Bourne-оболонки:
eval [arg ...]
Агги зчитуються і з'єднуються разомодна команда. Ця команда потім читається і виконується оболонкою, а її виходом статус повертається як значення eval. Якщо немає аргументів, або тільки нуль аргументів, eval повертає 0.
Ваш код може виглядати так:
read $input
eval echo "$$input"
Раніше shell буде розширювати значення $input
, так що в результаті командного рядка - припускаючи, що хтось входить HOME
в відповідь на запит - це:
eval echo $HOME
The $
просто втекти $
з так що оболонка не інтерпретує його як початок змінної під час першого пройти через командний рядок
Але тут є проблема, подумайте:
Enter input: ;date
$
Sun Feb 14 21:13:33 EST 2016
У цьому прикладі точку з комою змусила оболонку виконати команду, що не обов'язково те, що ми очікували або бажали. Ти можеш пом'якшити це трохи з кращим цитуванням:
eval echo ""$input""
Який з наведених вище прикладів призводить до:
$ sh foo.sh
Enter input: ;date
$;date
Але урок тут "не використовуй" eval
в безпеці ситуаціях ".