0

我有 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则执行所有四个语句。如果我想跳过其中一个 echo 语句,我将skipLETTER其用作第一个参数:

./script.sh skipA

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

./script -skipA -skipD

结果只打印BC字母。

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

4

2 回答 2

0

POSIX 标准 getopts 不能做长选项,只能做单字符选项,所以你不能将它用于问题中概述的确切界面。

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

继续使用可移植代码(getopts spec)并选择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-02-25T15:02:29.217 回答
0

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

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