/ / Linux shell script: Дозволити користувачеві використовувати змінні у вводі - linux, bash, shell, terminal

Сценарій оболонки Linux: Дозволити користувачеві використовувати змінні у вводі - linux, bash, shell, terminal

Я пишу 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 в безпеці ситуаціях ".