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个差异测试并不是一个漂亮的动作