Portál AbcLinuxu, 12. května 2025 02:02

Dotaz: Problém - patrně s result ve funkci

27.11.2012 22:14 Matonni
Problém - patrně s result ve funkci
Přečteno: 184×
Odpovědět | Admin
Ahoj, proč mi echo nic nevypíše? Mám tento kousek kódu
#!/bin/bash

function my_fnc ()
{
 ARR=()
 ARR+=("1")
 ARR+=("2")
 ARR+=("3")
 ARR+=("4")
 return $ARR 
}

VAR=( ${my_fnc} )

echo ${VAR[@]}
Díky za pomoc

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

27.11.2012 22:32 Kit
Rozbalit Rozbalit vše Re: Problém - patrně s result ve funkci
Odpovědět | | Sbalit | Link | Blokovat | Admin
Co má dělat příkaz 'function' v Bashi?
27.11.2012 22:40 l4m4
Rozbalit Rozbalit vše Re: Problém - patrně s result ve funkci
function je syntaktický bashismus, nedělá nic.
Řešení 1× (Michal Vyskočil)
27.11.2012 22:39 l4m4
Rozbalit Rozbalit vše Re: Problém - patrně s result ve funkci
Odpovědět | | Sbalit | Link | Blokovat | Admin
return: return [n]
    Return from a shell function.
    
    Causes a function or sourced script to exit with the return value
    specified by N.  If N is omitted, the return status is that of the
    last command executed within the function or script.
    
    Exit Status:
    Returns N, or failure if the shell is not executing a function or script.
Jasné? Shell není C/Java/whatever. Funkce je spíš takový skriptlet a return vrací status jako ze subprocesu. Vytvářet pole z funkce obecně nedoporučuji. Pro práci s komplexními datovými strukturami není shell vhodný nástroj. You have been warned...

(a)
my_func() {
   ARR=(1 2 3 4)
}

# prostě nastaví ARR
my_func
(b)
my_func() {
   echo 1 2 3 4
}

# nastaví ARR podle na výstup my_func rozdělený na slova
ARR=($(my_func))
(c) komplexní varianty se změnou IFS a jánevímčeho...
Řešení 1× (Michal Vyskočil)
28.11.2012 02:36 Delaunay | skóre: 17 | blog:
Rozbalit Rozbalit vše Re: Problém - patrně s result ve funkci
Odpovědět | | Sbalit | Link | Blokovat | Admin
Protože funkce v Bashi se nechovají jako funkce v běžných programovacích jazycích. A nevrací hodnoty jiného typu než návratového stavového kódu (exit -> $?).

Pokud je i tak potřeba hrát si v Bashi na programování silnější než použití k tomu vhodného nástroje, tak je to samozřejmě možné. Pokud vezmeme, že funkce bude vždy vracet pole, tak můžeme přepsat takto:
#!/bin/bash

function my_fnc()
{
    local ARR=()
    ARR+=("1")
    ARR+=("2")
    ARR+=("3")
    ARR+=("4")
    echo ${ARR[@]}
}

VAR=($(my_fnc))
echo ${VAR[@]}

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.