繁体   English   中英

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

[英]ksh script + print argument content in shell script

我想使用一个参数运行script.sh

如果第一个参数= action,那么script.sh将打印action参数- 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

已经两年了,但是这里有一个使用nameref (aka 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"
)

您要使用eval:

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

请注意,这样做会带来巨大的安全风险。 考虑如果用户使用第一个参数“; rm -rf /”调用脚本会发生什么情况

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

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

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

使用pdksh可以正常工作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM