【问题标题】:Running shell script inside shell script - good or bad?在 shell 脚本中运行 shell 脚本 - 好还是坏?
【发布时间】:2011-03-01 03:28:26
【问题描述】:

最近我在学校接到了一个作业,我们要在那儿用 Bash 脚本语言编写一个小程序。

这个 shell 脚本应该在命令行上接受一些位置参数或参数。

现在,在 if-else 语句的帮助下,我检查参数是否存在,如果参数存在,脚本会执行它应该执行的操作,但如果参数不存在 - 我会显示错误消息,提示用户输入参数并再次将参数传递给同一个 shell 脚本...

现在,我想知道这种方法在 Bash 编程范式中是好是坏。我有点怀疑这可能会在后台运行太多任务,这些任务保持打开状态或永不结束并继续消耗内存......请帮忙。

这是一个小sn-p(假设脚本名称是script1.bash):

 #!/bin/bash

 if [ $# -gt 0 ]; then
      read -p "Please enter your name: " name
      script1.bash $name
 elif [ $# -eq 1 ]; then
      echo "Your name is $1!"
 fi

【问题讨论】:

  • 如果这是学校作业,您应该包含作业标签。
  • @B Mitch - 从下次开始会处理这个问题..
  • 在 shell 脚本中运行的 shell 脚本?太可恶了。

标签: bash shell scripting


【解决方案1】:

这……有问题:-)

主要问题是每次有人拒绝输入他们的名字时,你都会生成一个子shell。

您最好使用以下内容:

#!/bin/bash
name=$1
while [[ -z "$name" ]] ; do
    read -p "Please enter your name: " name
done
echo "Your name is $name!"

产生 no 个子壳。

【讨论】:

  • 感谢 paxdiablo,我尝试使用 top 命令进行一些 becnhmarking,但没有任何显示...只是想知道???
  • 如果他使用exec 进行递归调用,他的原始代码会起作用吗?
  • 好吧,他的原始代码按原样工作(除了它应该是$1而不是elif位中的$name)除非你点击ENTER 这么多次系统耗尽进程。 exec 会阻止这种情况发生。我的回答更像是只做需要的事情。当您可以启动 while 循环时,启动另一个进程(甚至替换当前进程的内容,例如 exec)是没有意义的。
  • 感谢您的意见。我意识到我在 if-else 语句的第二部分搞砸了。非常感谢!