【问题标题】:How to use options in bash for skipping parts of code如何使用 bash 中的选项来跳过部分代码
【发布时间】:2014-02-17 10:23:34
【问题描述】:

我有 bash 脚本,我希望能够根据调用脚本时传递的选项跳过(即不执行)它的一些命令。

为了说明我想要完成的任务,我编写了带有 if 语句的脚本,它们基本上完成了相同的事情。

if [ "$1" != "skipA" ]
    then
    echo "A"
fi

if [ "$1" != "skipB" ]
    then
    echo "B"
fi

if [ "$1" != "skipC" ]
    then
    echo "C"
fi

if [ "$1" != "skipD" ]
    then
    echo "D"
fi

当调用脚本时没有传递任何参数时,所有四个echo 语句都会被执行。如果我想跳过其中一个回显语句,我使用skipLETTER 作为第一个参数:

./script.sh skipA

除了A 之外的所有字母都会被打印出来。它可以工作,但它确实有很多限制 - 一方面,我不能使用相同的参数跳过许多部分 ($1)。我想用选项实现同样的目标,所以我可以输入如下内容:

./script -skipA -skipD

因此只打印BC 字母。

我知道我可以使用getoptgetopts 来实现这一点,但我找不到任何简单的使用示例来实现我所描述的。

【问题讨论】:

  • 也许您可以在 if 语句中输入continue 以跳过第一个参数..good?

标签: bash if-statement options getopt getopts


【解决方案1】:

我使用具有以下算法的代码:

  1. 捕获file1中函数中的所有可执行代码
  2. 按照file2中的逻辑调用序列中的各个函数
  3. 调用 file2 时,每次调用都将限制在一个衬里,并将它们命名为步骤
  4. 使用跳过选项调用 file2
  5. 有一个 if 语句将这些行作为步骤读取并检查当前步骤是否小于所需步骤,如果是则继续下一步。否则使用 eval 对其进行操作。

【讨论】:

  • 感谢您的提示,但是您所描述的实际上比使用问题中所示的简单 if 语句要复杂得多(至少据我所知)-因为第 4 步是我这样做(尽管只有一个文件)并且有相同的限制(只有一个参数)。我要求提供带有选项的解决方案,因为它应该比我现在拥有的更易于使用。
  • 在这种方法中,您可以从失败的地方重新启动。 :) file1 更像是一个库(构建时它并不复杂,实际上它的模块化)
【解决方案2】:

POSIX 标准 getopts 不能执行长选项,只能执行单字符选项,因此您不能将它用于问题中概述的确切界面。

顺便说一句,长选项应该用两个破折号引入,而不是一个,否则在不知道实用程序的详细信息的情况下,无法判断 -skipA 是单个选项(可能带有 optarg)还是五个捆绑的单字符选项(-x -y-xy 相同,两者都与--xy 不同)。

继续使用可移植代码 (getopts spec) 并为 skip 选项选择 s,这是一个简短的示例:

#!/bin/sh

contains()
{
  case "$1" in
  *$2*) return 0 ;;
  esac
  return 1
}

requested()
{
  ! contains "$skip" "$1"
}

while getopts s: optname; do
  case $optname in
  s) skip="$OPTARG" ;;
  ?) exit 1 ;;
  esac
done

if requested A; then
  echo A
fi
if requested B; then
  echo B
fi
if requested C; then
  echo C
fi
if requested D; then
  echo D
fi

您可以使用./skip-parts.sh -s AC 和类似的工具对其进行测试。它会对未知选项和-s 做出反应,而没有 optarg 并带有类似于

的消息
./skip-parts.sh: illegal option -- x
./skip-parts.sh: option requires an argument -- s

如果您不喜欢默认的错误消息,您可以通过在 getopts(1) 的第一个参数前面加上一个冒号来使它们静音,并在 ? 的情况下给出您自己的(选项需要一个通过将 optname 设置为冒号来表示参数 案例...但您说您已经阅读过文档)。

【讨论】:

    猜你喜欢
    • 2014-10-21
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    相关资源
    最近更新 更多