linux - 使用位置参数和 1 个命名参数的组合

标签 linux bash shell unix getopts

我仍在用这些功能“烘烤”我的 shell,所以我的问题听起来可能不像“完全准备好”..它更像是“设计这个的最佳方法是什么”而不是“我遇到了这个错误”否则这行不通..现在我该怎么办“,所以请耐心等待。当我解释
我正在考虑可以在 2 种模式下运行的 shell 程序

  • 标准模式是一堆位置参数
    例如myprogram date1 date2 date3 date4 # 可以无限期地继续下去
  • 命名参数模式
    myprogram -r date1 # Just 1 date para allowed

他们当然是互斥的 myprogram date1 date2 date3 date4 可以
myprogram -r date1 date2 date3 date4 不是因为 -r 预期只有 1 个参数

我知道 getopts 提供了一个命名参数功能,可以通过一系列选项转换
我已经准备好标准模式并开始工作,想“添加”到代码中以获取命名参数模式
在标准模式下,我的代码模式类似于

for args
do
stuff that I want done here 
shift
done

所以这就是我对命名参数模式逻辑的思考
(当我使用 getopts 并且使用了超过 1 个位置参数时,它应该退出。)
getopts 只允许 1 个参数,我正在考虑这样的参数

while getopts "r:"  opt; 
do
case statement of getopts 
<stuff I want to do >
esac 
done


为了将位置参数限制为 1,我应该有这样的东西吗?
[ "$#"-eq 2 ] ||死亡“超过 1 个段落不在此处”
2 是因为当我在上面的 while 循环中时,-r 是第一个位置。 para 和 1 para 是进入其中的变量。我必须在循环内进行检查,因为如果未使用 -r 选项,我希望它在不执行任何操作的情况下失败,在这种情况下,我可以根据需要拥有尽可能多的 pos 参数
那么我如何做这道菜最好——这就是我想要了解的。 将 getopts 代码放在第一位,然后跟进位置参数代码? 对不起,如果我的问题太具体了。

最佳答案

我并不总是使用 getopts,但是当我使用时,它看起来像这样:

...

#Defaults
Verbose=false
ropt=false

# Options
while getopts vr: opt; do
  case "$opt" in
    v)  Verbose=true; vopt="-v" ;;
    r)  ropt=true; rarg="$OPTARG" ;;
    *)  usage; exit 1 ;;
  esac
done
shift $((OPTIND - 1))

if $ropt && [ $# -gt 0 ]; then
  $Verbose && echo "Too many arguments. Bye." >&2
  exit 1
elif $ropt; then
  args=( "$rarg" )
else
  args=( "$@" )
fi

# then...
for thing in "$args"; do
  ... something with $thing ...
done

getopts 循环后的第一个条件控制您是在多参数还是单参数 (-r) 模式下运行。随后的 else 填充 $args 数组,您可以稍后对其进行任何操作。

关于linux - 使用位置参数和 1 个命名参数的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35255773/

相关文章:

linux - 在 Bash 中正确引用 : Attach numbers stored in i to a

ios - 使用 xcodebuild 在模拟器上构建和运行应用程序

java - 最终的 Processbuilder 命令是什么样的?

c - 修复 ms 编译器 c 代码以在 gcc 中编译

linux - 如何在带双引号的ssh命令中处理单引号

c - 从 c 程序中确定 TASK_SIZE

Bash 粘贴命令输出格式

Bash:以编程方式获取命令的完成输出(例如,在变量中)

android - 如何使用 ADB 命令检测正在运行的应用程序

javascript - NodeJS Javascript 代码在 Windows 上运行但在 Linux 上不运行