linux - 难以解析输入参数

标签 linux bash shell

我的 shell 输入应遵循以下签名。

myscript.sh var1 var2 [-o var3] [-r var4].

-o 和 -r 是可选输入,这些选项可以出现在任何位置(在 var1 和 var 2 之间或在开始/结束处),但如果指定了 var 3,则 var3 将始终在 var4 之前。 var1 也将在 var 2 之前。

#!/bin/bash

case "$#" in
([01]) echo "Usage: $0 var1 var2 [-o val3] [-r val4]" >&2; exit 1;;
esac

VAR1="$1"
VAR2="$2" 
VAR3=
VAR4=


while getopts ":o:r:" opt; do
  case $opt in
    o)
     VAR3=$OPTARG
      ;;
    r)
     VAR4=$OPTARG 
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done

shift $(( OPTIND - 1 ))


    if [ -z "${VAR3+xxx}" ] && [ -z "${VAR4+xxx}" ];
    then
    echo $1 $2;
    elif [ -z "${VAR3+xxx}" ]; 
    then
    echo $1 $2 $VAR4;
    elif [ -z "${VAR4+xxx}" ];
    then 
    echo $1 $2 $VAR3;
    else
    echo $1 $2 $VAR3 $VAR4;
    fi

如何处理可选参数在 var1 和 var2 之间的情况

最佳答案

您的调用约定与“选项和参数优先”的经典调用约定相冲突。因此,您需要执行以下操作:

case "$#" in
([01]) echo "Usage: $0 var1 var2 [-o val1] [-r val2]" >&2; exit 1;;
esac

VAR1="$1"
VAR2="$2"
shift 2

# Now use your getopts loop...

关于linux - 难以解析输入参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13073658/

相关文章:

bash脚本中的Mysql密码警告

linux - 如何在 Linux/Unix 终端中开始和停止打印具有特定文本的行

linux - "echo || true"有什么用?

linux - 从 mingw32 编译的 lib/a 文件中获取 DLL 名称

linux - 调试 bash/ksh 脚本和下标

bash - PIPESTATUS 忽略否定?

excel - 在 VBA 中执行脚本后退出 Cmd 窗口

linux - linux内核线程的上下文

linux - 有没有办法确定 free() 是否会失败?

c++ - ncurses A_ALTCHARSET 字符未在 OSX 上显示