Qual é a sintaxe bash para extrair os valores de várias instâncias do mesmo argumento?

2

Eu quero usar várias instâncias do parâmetro de linha de comando, como a opção -d usada por PHP para passar PHP opções. Atualmente, estou usando o comando getopts em bash .

Com a invocação do PHP, ficaria assim:

php -f aPHPscript.php -d memory_limit=120M -d apc=1 -d max_execution_time=120

Como as várias instâncias do parâmetro seriam extraídas em um script bash? Existe um comando bash para fazer isso?

    
por vfclists 01.03.2014 / 03:06

2 respostas

3

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

Referências

por 01.03.2014 / 03:51
2

Você precisa chamar getopts várias vezes. Você deve tomar cuidado com o que fazer com os argumentos da opção. Você pode usar um índice, escrever todos os argumentos para -d to option_d[index_d++] para obter uma matriz. Mas isso não tem nada a ver com getopts .

    
por 01.03.2014 / 03:26