【问题标题】:getopts in bash scriptsbash 脚本中的 getopts
【发布时间】:2023-12-05 22:24:01
【问题描述】:

我正在尝试理解一段使用 getopts 的 bash 脚本。

我有

#!/bin/bash

function Argparser () {
    while getopts 'o:dfath' arg "$@"; do
        case $arg in
          'o')
             echo "oooooh"
             output_dir=${OPTARG}
             ;;
          'd')
             echo 'ddddddd'
             use_data_calib=true
             ;;
          ?)
             echo "UNKNWON ARGS: ${OPTARG} "
             exit 1
             ;;
        esac
    done
}

#----------------------------------------
#       user parameters
#----------------------------------------
# data directory(required)
data_root_dir=$1
# output directory
output_dir=${data_root_dir}/videos

declare others=${@:2}
Argparser ${others}

#declare use_data_calib=false  #<<-----HERE

echo ${output_dir}
echo ${data_root_dir}
echo ${others}
echo ${use_data_calib}

首先我想了解dfath 的作用,以及使用o:dfath 时期望的参数。 我应该如何调用此脚本以及使用哪些选项?

引起我注意的另一件事是注释行 (HERE) 。我评论了它,现在我可以将use_data_calib 设置为真或假。但是在我正在阅读的原始代码中,该行没有被注释。 那条线不是违背了论点d 的目的吗?因为有了那一行,use_data_calib 总是 错误...

【问题讨论】:

  • 请将您的脚本粘贴到shellcheck.net 并尝试实施那里提出的建议。

标签: bash getopts


【解决方案1】:

o:dfath 只是一个字符串,表示脚本采用的选项。

字母是它可以采用的所有选项,例如-o-d 等。 冒号左侧的字母表示需要参数的选项,例如-o myargument。冒号右边的字母不期望参数。

关于你的第二点,我相信你是对的。您正在使用的脚本可能不完整或不正确。

【讨论】:

  • 谢谢。如果字母是选项,那么-f 必须是选项。但是在这种情况下,如果我这样说,它会打印“Unknown args”对吗?