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

cha*_*987 3 ksh options input shell-script getopts

我想编写一个 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"
Run Code Online (Sandbox Code Playgroud)

正确输入示例:

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

some_string输入未在我的脚本中捕获。我怎么能抓住它?

Sha*_*off 5

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

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