shell脚本中的ksh脚本+打印参数内容

时间:2012-02-08 12:49:52

标签: linux bash shell unix ksh

我想用一个参数运行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 :(得分:0)

您想使用eval:

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

请注意,执行此类操作会带来巨大的安全风险。考虑如果用户使用第一个参数“; rm -rf /”

调用脚本会发生什么

您可以通过以下方式缓解此类问题:

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

但实际上你只是在惹麻烦(如果第一个参数包含双引号,那么最后一个版本将会很困难,而$()构造将允许执行任意命令)。简单地使用case语句并检查参数是否与您正在查找的字符串完全匹配更安全。或者,至少检查您正在评估的参数不包含以下任何字符:;()$"'。检查它只包含字母数字(a-zA-Z0-9

可能是最安全的

答案 1 :(得分:0)

pdksh这很有效:

echo  "action" `eval echo '$'$1`

答案 2 :(得分:0)

已经两年了,但这是使用nameref(a.k.a。typeset -N)的一个例子。 它包括连续三次测试给定参数的有效性。

  1. 是给出了一个论点吗?
  2. 参数是否与已知变量匹配? nameref检查此内容。
  3. 目标变量是否设置了值?
  4. 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"
    )