【问题标题】:shell scripting, how to run different code based on selection?shell脚本,如何根据选择运行不同的代码?
【发布时间】:2014-11-13 13:19:44
【问题描述】:

我有一个如下的 shell 脚本...

#!/bin/ksh

set_logging() {
if [ -f "$LOG_FILE" ]
then
  mv $LOG_FILE $LOG_FILE.$SYNCDATE
else
  touch $LOG_FILE
fi
# set logging for stdout and stderr (run this if user selects start)
exec >> $LOG_FILE
exec 2>&1

# run this if user selects dry
#exec something else
#exec something else

}

set_logging

# menu
if [[ ! -n $1 ]] ; then
  clear
  echo ""
  echo "What are you trying to do?"
  echo "start"
  echo "dry"
  echo "help"
  echo ""
  exit 99
fi

case "$1" in
  start)    run_tar;;
  dry)  nothing_here_yet;;
  help) print_help;;
  *) clear
echo "Your syntax is incorrect!"; exit 99;;
esac

这是实际脚本的片段,在 AIX 7.1 UNIX 操作系统上运行。

我要做的是基于用户在菜单上的选择,更改在 set_logging() 块中执行的部分(你会注意到我评论了我想要运行的代码,如果用户选择不同的菜单选项只是为了帮助这个例子)。

再次,这是一个简单的示例,以便我理解并可以在我的 shell 脚本的不同部分使用它。

有人可以帮忙吗?

【问题讨论】:

  • 你已经知道如何根据变量的值做不同的事情了。您在该 sn-p 的底部使用它。只需将其应用于set_logging 内部。您还需要将"$1" 传递给函数。
  • @EtanReisner 我想这就是他所期待的答案,你能把它贴在答案部分吗

标签: bash shell unix ksh aix


【解决方案1】:

我并不完全清楚一些细节。如果将以下代码放在 cmets 所在的顶部,则它不会真正起作用,因为可能未设置 $1。如果 $1 为空,则需要进行测试。对于您的描述,您不需要像案例陈述那样复杂的东西。您可以使用 if 语句来做到这一点:

if [[ "$1" = "dry" ]] ; then
  exec something
  exec somethingelse
fi

你想要 $1 内引号。否则,如果未设置,$1 将完全消失,语句变为无效。与您拥有的 if 测试类似,您应该将 $1 放在双引号内。

您可以根据很多因素使用 = 或 ==。通常 = 和 == 是等价的,但有一些例外(例如非常古老的 bourne shell 没有 == 等)

最后一个[[ ! -n $1 ]] 可能写得更好[[ -z "$1" ]]

【讨论】:

  • [[ 没有 [ 的空参数问题,因为它是句法而不是命令。
  • 谢谢。我可能会继续用双引号将 shell 变量括起来。我使用很多语言和不同的平台。如果我发现在任何地方都可以使用的东西,我会使用它。这让我不必尝试记住所有平台上所有语言的所有特殊情况。实际上。我倾向于在任何地方都做“${x}”,但我认为这不会增加这个用户的理解。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2014-11-20
  • 2023-02-08
相关资源
最近更新 更多