O Bash normalmente não se importa com os valores dos argumentos, é mais a ordem deles e como eles são separados na linha de comando, por padrão analisando-os com base em um espaço entre cada argumento.
Você pode ver isso com uma simples construção de for
em um script de shell da seguinte forma:
#!/bin/bash
echo ""
echo "ARGS: $@"
echo ""
echo "parsed args:"
for i in "$@"; do
echo "$i"
done
Exemplo
$ ./parse.bash -f aPHPscript.php -d memory_limit=120M -d apc=1 \
-d max_execution_time=120
ARGS: -f aPHPscript.php -d memory_limit=120M -d apc=1 -d max_execution_time=120
parsed args:
-f
aPHPscript.php
-d
memory_limit=120M
-d
apc=1
-d
max_execution_time=120
Acima, cada iteração através do loop está "descascando" o próximo argumento que foi passado para o script parse.bash
. Então, em vez de usar getopts
, você sempre poderia fazer algo assim.
Usando enquanto + case
Eu normalmente não uso getopts
e faço as coisas que você está perguntando assim com um loop while
usando uma declaração case
para analisar os argumentos conforme necessário.
$ more parse2.bash
#!/bin/bash
while [[ $# > 1 ]]
do
key="$1"
shift
# -f aPHPscript.php -d memory_limit=120M -d apc=1
#+ -d max_execution_time=120
case $key in
-f)
f_ARG="$1"
shift
;;
-d)
d_ARGS=( "${d_ARGS[@]}" "$1" )
shift
;;
*)
# unknown option
;;
esac
done
echo "$f_ARG"
echo "${d_ARGS[@]}"
Quando executamos isso com seus argumentos, podemos ver que ele foi capaz de analisar seus argumentos -d
em uma matriz, $d_ARGS
.
$ ./parse2.bash -f aPHPscript.php -d memory_limit=120M -d apc=1 \
-d max_execution_time=120
aPHPscript.php
memory_limit=120M apc=1 max_execution_time=120