Prefixo todos os argumentos com -o em BASH

3

Como prefixo -p a todos os argumentos passados para minha função?

Modificar os próprios argumentos e criar uma nova matriz são bons.

    
por Mehrdad 14.07.2011 / 05:34

3 respostas

4

Isso deve funcionar bem mesmo para argumentos complicados com espaço em branco e pior:

#!/bin/bash
new_args=()
for arg
do
    new_args+=( '-p' )
    new_args+=( "$arg" )
done

for arg in "${new_args[@]}"
do
    echo "$arg"
done

Teste:

$ ~/test.sh foo $'bar\n\tbaz bay'
-p
foo
-p
bar
    baz bay
    
por 14.07.2011 / 09:41
1

Coloque os argumentos em uma matriz e use substituição de padrões bash neles com substituição de matriz e correspondência de prefixo:

ARGS=("$@")
echo ${ARGS[@]/#/-p }

Isso substitui o início de cada argumento com -p<space> .

Infelizmente, isso não funciona corretamente se você tiver espaços em seus argumentos. Os espaços são preservados corretamente com ARGS=("$@") , mas não quando você faz a expansão ${ARGS[@]/#/-p } . Você pode colocar aspas duplas nessa expansão, mas você obtém -p arg1 como um único argumento, não dois argumentos.

Se você não precisa de -p<space> prefixado, apenas -p , então colocar aspas duplas em torno da expansão deve funcionar bem. Experimente com e sem aspas duplas em torno da expansão para ver o que funciona melhor para você.

    
por 14.07.2011 / 08:03
1

Você pode preservar os espaços na expansão ${ARGS[@]/#/-p } se definir a variável IFS como uma string nula!

# sample code
(
set -- 1 2 3 'arg with spaces' $'bar\n\tbaz bay'
printf 'oldIFS: %q\n' "$IFS"
IFS=""                       
#IFS=" "                       
printf 'newIFS: %q\n' "$IFS"
ARGS=("$@")
ARGS=( ${ARGS[@]/#/-p } )
for ((i=0; i < ${#ARGS[@]}; i++)); do
  echo "$i: ${ARGS[i]}"
done
)

Dentro de uma função, você pode limitar o escopo de uma variável IFS modificada a essa função usando declare IFS="" .

    
por 14.07.2011 / 09:58

Tags