como analisar corretamente os argumentos e argumentos do shell script usando getopts

0

Eu sou novo em usar isso:

por exemplo, ./imgSorter.sh -d directory -f format

o conteúdo dos scripts é:

#!/bin/bash
while getopts ":d:f:" opt; do
  case $opt in
    d)
      echo "-d was triggered with $OPTARG" >&2
      ;;
    f)
      echo "-f was triggered with $OPTARG" >&2
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done

casos de uso:

$ ./imgSorter.sh -d myDir -d was triggered with myDir OK

$ ./imgSorter.sh -d -f myFormat -d was triggered with -f NOK: como é que uma string começando com - não é detectada como uma bandeira?

    
por St3an 26.04.2018 / 15:34

1 resposta

3

Você disse a getopts que a opção -d deve aceitar um argumento e na linha de comando você usa -d -f myformat , o que claramente (?) diz " -f é o argumento que estou dando à -d option ".

Isso não é um erro no código, mas no uso do script na linha de comando.

Seu código precisa verificar se os argumentos da opção estão corretos e se todas as opções estão definidas de maneira apropriada.

Possivelmente algo como

while getopts "d:f:" opt; do
  case $opt in
    d) dir=$OPTARG      ;;
    f) format=$OPTARG   ;;
    *) echo 'error' >&2
       exit 1
  esac
done

# If -d is *required*
if [ ! -d "$dir" ]; then
    echo 'Option -d missing or designates non-directory' >&2
    exit 1
fi

# If -d is *optional*
if [ -n "$dir" ] && [ ! -d "$dir" ]; then
    echo 'Option -d designates non-directory' >&2
    exit 1
fi

Se a opção -d for opcional e você quiser usar um valor padrão para a variável dir no código acima, comece definindo dir como padrão valor antes do loop while .

Uma opção de linha de comando não pode aceitar nem aceitar argumentos.

    
por 26.04.2018 / 15:39