如何正确捕获可选参数和非可选参数?

如何正确捕获可选参数和非可选参数?

我想编写一个 shell 脚本,它将接受一些参数和一些选项并打印这些参数。假设该脚本的名称是abc.ksh.该脚本的用法是 -
./abc.ksh -[a <arg>|b <arg>|c|d] <some_string>
现在我编写一个 shell 脚本,它将采用选项和参数

#!/bin/ksh

# Default Values
vara=","
varb=false
varbname=""
varc=false

# Scanning inputs
while getopts :a:b:cd option
do
        case $option in
                a) vara=$OPTARG;;
                   #shift $((OPTIND-1));;
                b) varb=true
                   varbname=$OPTARG;;
                   #shift $((OPTIND-1));;
                c) varc=true;;
                   #shift $((OPTIND-1));;
                d) echo "Usage $0 \-[a|b|c|d] <filename>"
                   exit 0;;
                \?) echo "Invalid option -$OPTARG. Please run '$0 -h' for help"
                    exit 1;;
                :) echo "Option -$OPTARG requires an argument. Please run '$0 -d' for help"
                   exit 1;;
esac
done

print "Args: $* \nvara: $vara \noptfile: $varb \nvarbname: $varbname \nvarc: $varc"

正确输入的示例:

  • ./abc.ksh -a "sample text" "some_string"
  • ./abc.ksh "some_string" -a "sample text"
  • ./abc.ksh -asample\ text some_string
  • ETC...

some_string我的脚本中没有捕获输入。我怎样才能抓住它?

答案1

程序通常会强制“some_string”部分作为最后一个参数,因此这.abc.ksh "some_string" -a "sample text"是一个错误。如果这样做,则在解析选项后,将保留最后一个参数(部分)$OPTIND的索引。"some_string"

如果这是不可接受的,那么您可以在开头(在输入之前检查while是否存在非前缀参数。这将让您"some_string"在开头和结尾处都有。如果您需要在中间,您可以不使用getopts,也可以有两组getopts. 当第一个错误时,可能是由于无前缀参数;获取它并开始一个新的getopts以获取剩余的参数。一起推出您自己的解决方案。

答案2

捕获您的选择后

shift $OPTIND
if [ $# -eq 1 ]; then
  some_str="$1"
else
  echo "Error: missing argument" >&2
fi

相关内容