argumentos “traço” para shell scripts [duplicados]

0

A maioria dos scripts de shell que eu uso tem sintaxe como

./shellscript.sh -first_argument_flag <first_argument_value> -second_argument_flag <second_argument_value>

mas todos os recursos on-line para scripts de shell discutem somente a aprovação de argumentos posicionais como

./shellscript.sh <first_argument_value> <second_argument_value> 

que são usados subseqüentemente no script como "$1" , "$2" , etc.

Eu gostaria de usar a primeira sintaxe mais fácil de usar do que a sintaxe do argumento posicional. Por exemplo, suponha que eu queira fazer o eco de um nome de arquivo com o sinalizador -f e um diretório com o sinalizador -d. Chame esse script echofd.sh. Eu quero

./echofd.sh -f myfile.txt -d /my/directory/ 

para produzir a saída

Seu arquivo é: myfile.txt

Seu diretório é: / my / directory /

e independentemente de qual ordem -f e -d estão posicionados na chamada do script.

    
por ALB 04.11.2016 / 18:45

2 respostas

6

Há o getopts utilitário (interno) em shells POSIX para analisar a linha de comando argumentos.

Você pode usar este modelo:

#! /bin/sh -
PROGNAME=$0

usage() {
  cat << EOF >&2
Usage: $PROGNAME [-v] [-d <dir>] [-f <file>]

-f <file>: ...
 -d <dir>: ...
       -v: ...
EOF
  exit 1
}

dir=default_dir file=default_file verbose_level=0
while getopts d:f:v o; do
  case $o in
    (f) file=$OPTARG;;
    (d) dir=$OPTARG;;
    (v) verbose_level=$((verbose_level + 1));;
    (*) usage
  esac
done
shift "$((OPTIND - 1))"

echo Remaining arguments: "$@"

Isso analisa os argumentos da maneira padrão, como outros comandos padrão o fazem. por exemplo, você pode chamá-lo como:

myscript -vvv -f file -d dir other arg
myscript -ffile -ddir -- other arg

Veja a especificação POSIX ou o manual do seu shell para detalhes.

    
por 04.11.2016 / 19:04
0
#!/bin/bash
myfile=''
mydir=''

parse_args() {
    case "$1" in
        -d)
            mydir="$2"
            ;;
        -f)
            myfile="$2"
            ;;
        *)
            echo "Unknown or badly placed parameter '$1'." 1>&2
            exit 1
            ;;
    esac
}

while [[ "$#" -ge 2 ]]; do
    parse_args "$1" "$2"
    shift; shift
done
    
por 04.11.2016 / 18:54