如何绕过bash中以下参数的可选参数?

Posted

技术标签:

【中文标题】如何绕过bash中以下参数的可选参数?【英文标题】:How to bypass an optional argument for the following argument in bash? 【发布时间】:2015-09-20 12:32:50 【问题描述】:
TABLE=`echo "$1" | tr '[:upper:]' '[:lower:]'`
if [ $1 = -d ]
   then TABLE=daminundation
elif [ $1 = -b ]
   then TABLE=burnscararea
elif [ $1 = -r ]
   then TABLE=riverpointinundation
elif [ $1 = " " ]
   then echo "User must input -d (daminundation), -b (burnscararea) 
   or -r (riverpointinundation)."
fi
SHAPEFILEPATH=$2
MERGEDFILENAME=$3
if [ -z $3 ] ; 
  then MERGEDFILENAME=merged.shp
else
  MERGEDFILENAME=$3
fi
COLUMNNAME=$4
if [ -n $4 ]
  then COLUMNNAME=$4
fi

$3 & $4 是可选参数。但是,如果我选择不使用 $3 但我想使用 $4,它会将命令读取为 $3。被其他方法弄糊涂了,我应该怎么做才能让下一个不需要的可选命令绕过?

【问题讨论】:

./your_script.sh param_1 param_2 "" param_4 你在找getopts @LucM 第一个选项适用于简单的解决方案,getopts 似乎是更有条理的解决方案。谢谢。 【参考方案1】:

你可能想要这个:

#!/bin/bash

while getopts ":b :d :r" opt; do
  case $opt in
    b)
      TABLE=burnscararea
      ;;
    d)
      TABLE=daminundation
      ;;
    r)
      TABLE=riverpointinundation
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
  esac
done

shift $((OPTIND-1))

[ -z "$TABLE" ] && ( echo "At least one of -b/-d/-r options must be provided"; exit 1; )
[ $# -ne 3 ] && ( echo "3 params expected!"; exit 1; )
SHAPEFILEPATH="$2"
MERGEDFILENAME="$3"
COLUMNNAME="$4"
# other stuff

【讨论】:

虽然这没有解决第三个和第四个参数,只是表的第一个参数,但它确实为我需要的解决方案提供了一个工作模板。欣赏!

以上是关于如何绕过bash中以下参数的可选参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 argparse 中使用带有 nargs='*' 参数的可选位置参数?

使用argparse的可选命名参数

游标 where 子句中的可选参数

where 条件中的可选参数 - 如何提高性能 - PL/SQL

如何键入提示函数的可选返回参数? [复制]

如何匹配url中的可选参数? [复制]