сценарий ksh + вывод содержимого аргумента в сценарии оболочки - PullRequest
1 голос
/ 08 февраля 2012

Я хочу запустить script.sh с одним аргументом.

Если первый аргумент = действие, то script.sh напечатает параметр действия - restart machine each 1 min

Мой пример не работает, но, пожалуйста, посоветуйте, что нужно исправить в скрипте, чтобы я напечатал$action параметр, если аргумент action.

Примечание. Я не хочу устанавливать следующее решение - [[ $1 = action ]] && echo action "restart machine each 1 min

Мой пример сценария:

  #!/bin/ksh
  action="restart machine each 1 min"
  echo  "action" ${$1}

Примеркак запустить скрипт

  ./script.sh action

Ожидаемые результаты, которые мне нужно получить:

    action restart machine each 1 min

Ответы [ 3 ]

0 голосов
/ 08 февраля 2012

Хорошо с pdksh это работает:

echo  "action" `eval echo '$'$1`
0 голосов
/ 21 января 2014

Прошло два года, но вот пример использования nameref (он же typeset -N).Он включает три последовательных теста на достоверность заданного аргумента.

  1. Задан ли аргумент?
  2. Соответствует ли аргумент известной переменной?nameref проверяет это.
  3. Имеет ли целевая переменная значение?
action='This is the value of $action'
word='This it the value of ${word}'
list='This is a list'
lie='This is a lie'

(
typeset name=${1:?Usage: script.sh varname} || exit 
nameref arg1=${name} || exit

: ${arg1:?} || exit

echo "$name $arg1"
)
0 голосов
/ 08 февраля 2012

Вы хотите использовать eval:

action="restart machine each 1 min"
eval echo $1 \$$1

Обратите внимание, что выполнение чего-то подобного является огромной угрозой безопасности.Подумайте, что произойдет, если пользователь вызовет скрипт с первым аргументом "; rm -rf /"

Вероятно, вы можете решить такие проблемы с помощью:

eval "echo '$1' \"\$$1\""

, но на самом деле вы просто спрашиваетеиз-за проблем (эта последняя версия будет бороться, если первый аргумент содержит двойные кавычки, а конструкция $ () позволит выполнить произвольную команду).Гораздо безопаснее просто использовать оператор case и убедиться, что аргумент точно соответствует строке, которую вы ищете.Или, по крайней мере, убедитесь, что аргумент, который вы используете, не содержит ни одного из следующих символов: ;()$"'.Вероятно, безопаснее проверить, что он содержит только буквенно-цифровые символы (a-zA-Z0-9)

...