Argumentos "dash" para scripts de shell

Argumentos "dash" para scripts de shell

A maioria dos scripts shell que 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 criadores de scripts de shell discutem apenas a passagem de argumentos posicionais como

./shellscript.sh <first_argument_value> <second_argument_value> 

que são posteriormente usados ​​no script como "$1", "$2", etc.

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

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

para produzir a saída

Seu arquivo é: meuarquivo.txt

Seu diretório é: /meu/diretório/

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

Responder1

Aí está ogetoptsutilitário padrão (integrado)em shells POSIX para analisar argumentos de linha de comando.

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 fariam outros comandos padrão. por exemplo, você pode chamá-lo como:

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

Vera especificação POSIXou o manual do shell para obter detalhes.

Responder2

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

informação relacionada