Linux ksh脚本+;在shell脚本中打印参数内容
我想用一个参数运行Linux ksh脚本+;在shell脚本中打印参数内容,linux,bash,shell,unix,ksh,Linux,Bash,Shell,Unix,Ksh,我想用一个参数运行script.sh 如果第一个参数=动作,则script.sh将打印动作参数-每1分钟重启一次机器 我的示例不起作用,但请建议脚本中需要修复的内容,以便在参数为action时打印$action参数 备注我不想设置以下解决方案-[[$1=action]&&echo action“每1分钟重新启动一次机器” 我的示例脚本: #!/bin/ksh action="restart machine each 1 min" echo "action" ${$1} 如何运行脚
script.sh
如果第一个参数=动作,则script.sh
将打印动作参数-每1分钟重启一次机器
我的示例不起作用,但请建议脚本中需要修复的内容,以便在参数为action
时打印$action
参数
备注我不想设置以下解决方案-[[$1=action]&&echo action“每1分钟重新启动一次机器”
我的示例脚本:
#!/bin/ksh
action="restart machine each 1 min"
echo "action" ${$1}
如何运行脚本的示例
./script.sh action
我需要获得的预期结果:
action restart machine each 1 min
您要使用eval:
action="restart machine each 1 min"
eval echo $1 \$$1
action=“每1分钟重新启动一次机器”
评估回声$1\$$1
注意,这样做是一个巨大的安全风险。考虑如果用户用第一个参数调用脚本,会发生什么情况;rm-rf/”
您可能可以通过以下方式缓解此类问题: eval "echo '$1' \"\$$1\"" 评估“echo'$1'\\$$1”但实际上,您只是在自找麻烦(如果第一个参数包含双引号,并且$()构造将允许执行任意命令,那么最后一个版本将很困难)。只需使用case语句并检查参数是否与您要查找的字符串完全匹配就更安全了。或者,至少检查您要计算的参数是否不包含以下任何字符:
;()$”
。检查它是否只包含字母数字(a-zA-Z0-9
)以及pdksh
最安全的方法是:
echo "action" `eval echo '$'$1`
已经两年了,但这里有一个使用
nameref
(也称为typeset-N
)的例子。
它包括对给定论点有效性的三次连续测试
action='这是$action'的值'
word='This是${word}的值'
list='这是一个列表'
这是一个谎言
(
typeset name=${1:?用法:script.sh varname}| |退出
nameref arg1=${name}| |退出
:${arg1:?}| |退出
回显“$name$arg1”
)
您的要求相互矛盾。解释一下你的问题:“我想检查第一个参数是否为'action',如果是,打印一个句子,但我不想使用检查第一个参数是否为'action',然后打印一个句子的解决方案。”为什么不想使用test$1=action&&echo…?嗨,William-这是因为我想要一个简单的代码/语法,第二点是我有超过50个论点,因此,执行50个差异测试并不是一个漂亮的动作