Como converter argumentos da linha de comando em uma matriz de scripts bash?
Eu quero pegar isso:
./something.sh arg1 arg2 arg3
e converta-o para
myArray=( arg1 arg2 arg3 )
para que eu possa usar o myArray para uso posterior no script.
Este post anterior do SO chega perto, mas não aborda como criar uma matriz: Como analiso argumentos de linha de comando no Bash?
Eu preciso converter os argumentos em uma matriz de script bash regular; Sei que poderia usar outras linguagens (Python, por exemplo), mas preciso fazer isso no bash. Eu acho que estou procurando uma função "acrescentar" ou algo semelhante?
UPDATE: Eu também queria perguntar como verificar se há zero argumentos e atribuir um valor de matriz padrão e, graças à resposta abaixo, consegui fazer isso funcionar:
if [ "$#" -eq 0 ]; then
myArray=( defaultarg1 defaultarg2 )
else
myArray=( "$@" )
fi
set
permite definir parâmetros posicionais para o escopo. Também permite definir opções de shell. Você pode fazerset foo
, o que significa que se$1
expande para "foo", mas se seus parâmetros começarem com um traçoset
, você assumirá que você deseja definir uma opção de shell. O traço duplo garante que todos os seguintes parâmetros sejam interpretados como parâmetros posicionais a serem configurados.echo $@
imprimirá todos os argumentos, masecho $myArray
somente o primeiro elemento. Para vê-los todos, useecho ${myArray[@]}
."${myArray[@]}"
. Se você quiser percorrer a matriz, você precisa as aspas para a divisão evitar seus elementos individuais no IFSTalvez isso possa ajudar:
Também é possível iterar sobre argumentos, omitindo 'in':
será equivalente
fonte
arg
campo - é uma variável predefinida?${var}
é expandido para o conteúdo devar
.${var[n]}
é expandido para o conteúdo do elementon
da matrizvar
. Está${var[@]}
expandindo toda a matriz, ou seja${var[0]} ${var[1]} ... ${var[n]}
(n
sendo o último índice do elemento)?Na verdade, a lista de parâmetros pode ser acessada com
$1 $2 ...
etc.Qual é exatamente equivalente a:
Portanto, a lista de parâmetros pode ser alterada com set
e
${!i}
é a maneira correta de acessá-los:Para o seu caso específico, isso pode ser usado (sem a necessidade de matrizes), para definir a lista de argumentos quando nenhum foi fornecido:
que se traduz nessa expressão ainda mais simples:
fonte
echo "$#" "$i+1" "${!i}";
obter a saída exatamente como mostrado?Aqui está outro uso:
fonte
Mais fácil ainda, você pode operar diretamente em
$@
;)Aqui está como passar uma lista de argumentos diretamente do prompt:
fonte
for stuff in "$@" ; do ...
é o mesmo quefor stuff ; do ...
:)Vista lado a lado de como a matriz e $ @ são praticamente os mesmos.
Código:
Entrada:
Resultado:
fonte
Vale ressaltar a importância das aspas duplas. Suponha que um argumento contenha espaço em branco.
Código:
Resultado:
fonte