Intereting Posts
dash reports «Синтаксическая ошибка:» («неожиданно» при использовании замещения процесса Не удалось получить доступ к общему ресурсу Linux с компьютера Windows с ошибкой NT_STATUS_BAD_NETWORK_NAME как использовать команду ssh для подключения к нескольким компьютерам и одновременно отправлять разные команды на каждый компьютер Значок не отображается в приложениях на OSX ядро выгружается из памяти в Linux Шаблон Grep для извлечения строк, где второе слово имеет только две гласные GNOME не запускается Что использует мое пространство подкачки? Производительность виртуальных дисковых файлов vs rawdisk Анализировать системные журналы с помощью logwatch -range, кроме как только «вчера», Как я могу использовать регулярное выражение для извлечения текста, следующего за двумя условиями, в переменную? Получение срока действия пароля Не удалось обновить мою систему Ubuntu13.04: Получение сообщения – требуется установка ненадежных пакетов Нужно ли включить G ++ в RHEL 6.1 Настройка привязок ключей Gnome Shell из командной строки

Сценарий оболочки Linux: разрешить пользователю указывать имена переменных в приглашении ввода

Я пишу shell-скрипт для linux-терминала. Я хочу иметь возможность вводить имена переменных в приглашении. Например:

test.sh:

test="Monkey in the middle..." read -p "Enter input: " input echo $input 

вывод:

  Enter input: $test $test 

Я хочу иметь возможность вводить «$ test» во время этапа read -p сценария и иметь эхо-скрипт «Обезьяна в середине …» в конце вместо эхо-теста «$ test», так как он Теперь.

Как мне это сделать?



ОБНОВИТЬ:

Используя ответы, предоставленные мне здесь и в этой теме (большое спасибо вкладчикам и комментаторам!), Мне удалось собрать эту линию, которая очень хорошо работала для меня:

 newvariable="$(eval echo $input)" 

Быть, рекомендуется, меня предупреждали не раз, что использование eval может представлять угрозу безопасности. Имейте это в виду, если вы выберете это решение.

Вместо

 echo "$input" 

пытаться

 eval echo "$input" 

Это даже не баш-специфический, работает в / bin / sh!

Обратите внимание, что это создает серьезную угрозу безопасности, потому что eval просто выполняет то, что вы ему даете. В этом случае оболочка интерпретирует строку $input как $test , а затем eval выполняет echo $test . Но что, если пользователь ввел $test; rm -rf * $test; rm -rf * ? eval будет представлен echo $test; rm -rf * echo $test; rm -rf * . Будьте очень осторожны, если вы это сделаете.

В bash вы можете использовать синтаксис расширения косвенного параметра :

 test="Monkey in the middle..." read -p "Enter input: " input echo ${!input} 

В этом случае пользователь должен предоставить test строку только без предшествующего знака доллара.

До тех пор, пока вы не возражаете, что пользователь может выполнять произвольные команды, включив подстановку команд $(…) , вы можете отправить строку в встроенный eval . Обратите внимание, что eval ожидает фрагмент оболочки, и если вход включает в себя кавычки, они могут вызывать синтаксические ошибки. (Относительно) простой способ справиться с кавычками – использовать здесь документ для выполнения замещений. Вы по-прежнему находитесь во власти неиспользованной переменной или подстановки команд (например, $(foo ).

 IFS= read -r -p "Enter input: " input eval "string=\$(cat <<EOF _${input} EOF )" string=${string#_}