Portál AbcLinuxu, 13. května 2025 20:26

Dotaz: Náhrada za eval

9.11.2012 11:56 Orlando
Náhrada za eval
Přečteno: 415×
Odpovědět | Admin
Zdravim, hledam reseni s náhradou za eval, prej je nebezpecne, poradite? Jinak nevim proc tam ta funkce eval je, kdyz se nedoporucuje pouzivat. Dekuji
function foo ()
{
eval $1="$2"
}

foo "A" "aaaaa"
echo "$A" #aaaaa

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

Odpovědi

9.11.2012 12:52 luky
Rozbalit Rozbalit vše Re: Náhrada za eval
Odpovědět | | Sbalit | Link | Blokovat | Admin
Zdravim, hledam reseni s náhradou za eval, prej je nebezpecne, poradite?
To je kec. Nebezpecni jsou akorat pitomci.
9.11.2012 13:26 l4m4
Rozbalit Rozbalit vše Re: Náhrada za eval
Odpovědět | | Sbalit | Link | Blokovat | Admin
Každý příkad shellu je nebezpečný. Vlastně používání počítačů je nebezpečné obecně a stěží ho lze doporučit.

Shell nemá symbolické dereference dávající l-value. Všechna řešení budou nějakým způsobem založena na intepretaci expandovaného kódu shellem -- stejně jako použití eval. Můžeš klidně udělat
declare -g $1="$2"
když nechceš použít eval, ale odolnější vůči neošetřeným argumentům to bude jen marginálně.
pavlix avatar 9.11.2012 13:59 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: Náhrada za eval
Vlastně používání počítačů je nebezpečné obecně a stěží ho lze doporučit.
+1
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
9.11.2012 15:01 Orlando
Rozbalit Rozbalit vše Re: Náhrada za eval
Dík, declare s přepinačem -g? Jsem se díval do manuálu ale takový přepinač tam není a hlásí to i chybu.
9.11.2012 15:08 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Náhrada za eval
bash$ bash --version
GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu)
The -g option forces variables to be created or modified at the global scope, even when declare is executed in a shell function. It is ignored in all other cases.
9.11.2012 15:14 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Náhrada za eval
Pro starší Bash < 4.2 lze místo deklarování nových proměnných použít ke stejnému účelu předdefinované globální asociativní pole.
9.11.2012 15:58 Ondrej
Rozbalit Rozbalit vše Re: Náhrada za eval
Odpovědět | | Sbalit | Link | Blokovat | Admin
Mě by se to taky šiklo ale vůbec to nefunguje. Jako by se to snažilo bash přímo spustit. Poradí někdo? Dík
MENU=("aaa|bbb"
      "ccc|ddd"
      "eee|fff")

rozdel_pole {
          OLD_IFS=$IFS
          IFS=$'|'
          ARRAY=( $3 )
          IFS=$OLD_IFS

          ARRAY_0=$( echo ${ARRAY[0]} )
          ARRAY_1=$( echo ${ARRAY[1]} )

          declare $1
          declare $2

          $1="$ARRAY_0"
          $2="$ARRAY_1"
}

          rozdel_pole "PRVNI" "DRUHA" "${MENU[1]}"

          echo $PRVNI $DRUHA

          rozdel_pole "PETR" "PAVEL" "${MENU[2]}"

          echo $PETR $PAVEL


/home/ucimse.sh: line 46: PRVNI=ccc: command not found
/home/ucimse.sh: line 47: DRUHA=ddd: command not found

/home/ucimse.sh: line 46: PETR=eee: command not found
/home/ucimse.sh: line 47: PAVEL=fff: command not found
9.11.2012 20:46 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Náhrada za eval
Jistě, bash provede substitucia výsledek se snaží spustit, nikoliv interpretovat aby došlo k přiřazení (k tomu lze právě použít eval). Takže vaše řádky
declare $1
declare $2
 
$1="$ARRAY_0"
$2="$ARRAY_1"
nahraďte buď (varianta s eval) řádky
eval $1="$ARRAY_0"
eval $2="$ARRAY_1"
nebo (varianta bez eval)
declare -g $1="$ARRAY_0"
declare -g $2="$ARRAY_1"

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.