Como capturar argumentos opcionais e não-opcionais corretamente?

3

Eu quero escrever um script de shell que vai levar alguns argumentos com algumas opções e imprimir esses argumentos. Suponha que o nome desse script seja abc.ksh . O uso desse script é -
./abc.ksh -[a <arg>|b <arg>|c|d] <some_string>
Agora eu escrevo um script de shell que terá opções e argumentos

#!/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"

Exemplos de entradas corretas:

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

some_string input não é capturado no meu script. Como posso entender isso?

    
por chanchal1987 08.03.2011 / 11:43

2 respostas

5

É típico dos programas forçar a parte "some_string" a ser o último argumento para que .abc.ksh "some_string" -a "sample text" seja um erro. Se você fizer isso, depois de analisar as opções, $OPTIND conterá o índice para o último argumento (a parte "some_string" ).

Se isso não for aceitável, você poderá verificar no início (antes de inserir o while para ver se há um argumento sem prefixo. Isso permitirá que você tenha "some_string" no início e no final Se você precisasse tê-lo no meio, você não poderia usar getopts ou você poderia ter dois conjuntos de getopts Quando o primeiro erro, poderia ser devido ao argumento não prefixado; e inicie um novo getopts para obter os argumentos restantes. Ou você pode pular todos os getopts e fazer sua própria solução.

    
por 08.03.2011 / 14:02
1

Depois de capturar suas opções

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