
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á ogetopts
utilitá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