Tente assim,
myFunction()
{
echo "$1"
echo "$2"
}
myFunction 1 2
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
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"
É 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.