Como analisar argumentos com espaço dentro da função bash

0

No bash eu estou chamando a função:

myFunction "1 2"
myFunction()
{
        echo "$1"
        echo "$2"
}

isto me imprime "1 2" e linha vazia. Como posso analisar argumentos para que ele seja impresso em uma linha 1 e em outro 2? Eu não posso chamar myFunction "1" "2" porque os argumentos são armazenados em alguma outra variável

    
por hudi 03.10.2018 / 16:22

3 respostas

1

Tente assim,

myFunction()
{
        echo "$1"
        echo "$2"
}

myFunction 1 2
    
por 03.10.2018 / 16:27
4

Parece que você quer dividir o primeiro argumento que sua função recebe em caracteres de espaço. Para isso, você poderia usar o operador split + glob depois de ter configurado a parte dividida para usar o espaço como delimitador e desativado a parte glob:

myfunction() {
  local -       # make changes to options local to the function.
                # needs bash 4.4 or newer.
  local IFS=' ' # split on space only
  set -o noglob # disable glob part
  set -- $1     # split+glob invoked on $1 by leaving that $1 unquoted,
                # result stored in $1, $2... using set --
  printf '%s\n' "$1"
  printf '%s\n' "$2"
}
myfunction "1 2"
    
por 03.10.2018 / 16:29
1

É o mesmo que dividir qualquer variável nos espaços. Use a divisão de palavras ou read :

Com a divisão de palavras:

var="foo bar"
set -f              # disable globbing
IFS=' '             # make sure IFS contains (just) a space
printf "%s\n" $var  

Com read , para um shell padrão (se você sabe que há apenas duas partes para dividir):

var="foo bar"
IFS=' ' read a b <<EOF
$var
EOF
printf "%s\n" "$a" "$b" 

O mesmo com uma string here (Bash / ksh / zsh):

var="foo bar"
IFS=' ' read a b <<< "$var"
printf "%s\n" "$a" "$b" 

Com read -a no Bash ou read -A no ksh / zsh, você pode dividir a string em um número arbitrário de partes e colocá-las em uma matriz:

var="foo bar"
IFS=' ' read -a arr <<< "$var"     # Bash
printf "%s\n" "${arr[@]}"

Em todos os itens acima, você pode usar $1 no lugar de $var como de costume.

As variantes com read também assumem que a cadeia não contém várias linhas.

No entanto, no Bash você também pode dividir uma string de várias linhas em um array usando qualquer espaço em branco como separador:

IFS=$' \t\n' read -d '' -a arr <<< "$var"

É claro que se você tiver a string em uma variável fora da função e executar myFunction $var , a variável será dividida em vários argumentos antes que a função seja executada.

    
por 03.10.2018 / 16:32