我想用一个参数运行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
答案 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
)的一个例子。
它包括连续三次测试给定参数的有效性。
nameref
检查此内容。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"
)