如何使用bash中的选项跳过部分代码

时间:2014-02-17 10:23:34

标签: bash if-statement options getopt getopts

我有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来实现这一目标,但我找不到任何能够实现我所描述内容的简单用法示例。

2 个答案:

答案 0 :(得分:0)

我使用以下算法的代码:

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

答案 1 :(得分: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和类似的方式对其进行测试。如果没有 optarg ,它会对未知选项和-s做出反应,其中的消息类似于

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

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