当没有提供选项或参数时,如何使用 getopts 运行指定的代码块?

当没有提供选项或参数时,如何使用 getopts 运行指定的代码块?

所以我正在编写一个脚本,将带参数的选项与不带参数的选项混合在一起。通过研究,我发现 getopts 是执行此操作的最佳方法,并且到目前为止,它很容易弄清楚和设置。我遇到的问题是弄清楚如何设置它,以便在没有提供选项或参数的情况下,让它运行一组单独的命令。这就是我所拥有的:

while getopts ":n:h" opt; do
  case $opt in
    n)
      CODEBLOCK >&2
      ;;
    h)
      echo "script [-h - help] [-n <node> - runs commands on specified node]" >&2
      exit 1
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done

我尝试在代码顶部添加类似的内容以捕获任何参数,但即使提供了选项和参数,它也会运行相同的代码(这里的语法可能有问题):

[[ -n "$1" ]] || {
CODEBLOCK1
}

while getopts ":n:h" opt; do
  case $opt in
    n)
      CODEBLOCK2 >&2
      ;;
    h)
      echo "script [-h - help] [-n <node> - runs commands on specified node]" >&2
      exit 1
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done

getopts 的手册页很少,我在搜索中发现的示例相对较少,可以提供对 getopts 的任何深入了解,更不用说它的所有各种功能了。

答案1

$1当为空时,您可以使用以下任一命令来运行命令:

[[ ! $1 ]] && { COMMANDS; }
[[ $1 ]] || { COMMANDS; }
[[ -z $1 ]] && { COMMANDS; }
[[ -n $1 ]] || { COMMANDS; }

此外,您不需要引用此特定示例中的扩展,因为不执行分词。

不过,如果您想检查是否有参数,最好使用(( $# )).

如果我理解你的意图,那么你的代码可以这样编写getopts

#!/bin/bash

(( $# )) || printf '%s\n' 'No arguments'

while getopts ':n:h' opt; do
    case "$opt" in
        n)
            [[ $OPTARG ]] && printf '%s\n' "Commands were run, option $OPTARG, so let's do what that says."
            [[ ! $OPTARG ]] && printf '%s\n' "Commands were run, there was no option, so let's run some stuff."
            ;;
        h) printf '%s\n' 'Help printed' ;;
        *) printf '%s\n' "I don't know what that argument is!" ;;
    esac
done

相关内容