【问题标题】:bash using getoptsbash 使用 getopts
【发布时间】:2012-10-24 18:03:30
【问题描述】:

脚本使用示例

./foo.sh -v -r /home/ -s /home/user/file
./foo.sh -r /home/ -s /home/user/file

在参数中我总是需要一个文件或文件夹来扫描和一个数据库文件(-s 数据库文件)

在 foo.sh 中

function entrance()
{
while getopts "v:r:s" opt; do
  case $opt in
    v)
      echo "-v was triggered, Verbose mode" >&2
      ;;
    r)
      echo "-r was triggered, recursive mode: $OPTARG" >&2
      ;;
    s)
      echo "-s was triggered, DATABASE: $OPTARG" >&2
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done
}

我不知道为什么它不起作用。

请修理我。

谢谢

【问题讨论】:

  • 根据你的例子,你的选项字符串应该是getopts ":vr:s:"——你有什么,-v-r需要参数,-s不需要。
  • 它在什么方面不“工作”?有错误信息吗?

标签: linux bash


【解决方案1】:

您可能在调用函数时忘记了 $@。看到这个:

#!/bin/bash

function entrance() {
while getopts "v:r:s" opt; do
  case $opt in
    v)
      echo "-v was triggered, Verbose mode" >&2
      ;;
    r)
      echo "-r was triggered, recursive mode: $OPTARG" >&2
      ;;
    s)
      echo "-s was triggered, DATABASE: $OPTARG" >&2
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done
}

entrance "$@"

还有一些解释:Using getopts within user-defined-function in bourne shell

【讨论】:

  • 您应该在$@ 周围使用双引号,以避免参数中的空格或其他元字符出现问题。