Como posso ajustar a expansão de variáveis entre aspas?

5

Meu script bash é assim:

#!/bin/bash
set -x 

./test FLAGS=${@:2}

E quando executo ./script 1 2 3 , o comando executado é ./test FLAGS=2 3 . Eu quero FLAGS="2 3" .

Quando altero a quarta linha para ./test FLAGS="${@:2}" , não há alteração.

Quando altero a quarta linha para ./test FLAGS=\"{@:2}\" , recebo ./test 'FLAGS="2' '3"' , o que realmente não é o que eu quero.

Como eu simplesmente envolvo minhas variáveis entre aspas?

    
por Derek 24.12.2015 / 10:11

3 respostas

8

Use

"${*:2}"

em vez de

"${@:2}"

$@ e ${x[@]} e suas variantes, expandir para uma "palavra" por elemento na matriz quando citada. $* (e ${x[*]} ) expande para uma única palavra com todos os elementos unidos usando o primeiro caractere de $IFS .

Se eles não forem citados, as duas versões passam por divisão de palavras e crie várias palavras divididas em qualquer um dos caracteres de IFS ocorrer.

    
por 24.12.2015 / 10:21
2

Com base nos comentários, meu entendimento é que você deseja descartar (ou armazenar em algum lugar) o primeiro argumento e depois usar o restante dos argumentos como argumentos para outro script ou comando do qual está chamando no script.

Se for assim, você pode fazê-lo facilmente, e não precisa definir uma variável ( FLAGS ou qualquer outra coisa) para passar os parâmetros do script para o comando dentro do seu script. Veja o seguinte exemplo:

#!/bin/bash
set -x

original_first_arg="$1"     # Use this line if you need to save the value to use later.

shift
mycommand "$@"

O comando shift é um bash incorporado. Por si só (sem dar qualquer número), apenas joga fora o primeiro argumento do script (parâmetro posicional). A partir do manpage:

   shift [n]
          The  positional  parameters  from n+1 ... are renamed to $1 ....
          Parameters represented by the numbers  $#  down  to  $#-n+1  are
          unset.   n  must  be a non-negative number less than or equal to
          $#.  If n is 0, no parameters are changed.  If n is  not  given,
          it  is assumed to be 1.  If n is greater than $#, the positional
          parameters are not changed.  The return status is  greater  than
          zero if n is greater than $# or less than zero; otherwise 0.

Em seguida, "$@" é expandido para os parâmetros exatos que você forneceu ao script, menos o primeiro $1 , pois foi descartado pelo comando shift .

Leitura adicional:

por 24.12.2015 / 17:50
2

Se você quiser diferentes conjuntos de parâmetros com base nos argumentos do seu script, então pode usar funções para isso:

other_script(){ shift; command other_script "$@"; }
other_script "$@"

É como eu normalmente faço isso. Uma função pode chamar outra função, ou definir uma nova função - ou redefinir-se. Cada função recebe um array.

    
por 24.12.2015 / 23:55

Tags