Portál AbcLinuxu, 8. května 2024 03:00


Dotaz: Bash a oprava scriptu

14.6.2012 13:46 Othelo
Bash a oprava scriptu
Přečteno: 364×
Odpovědět | Admin
Ahoj, tento kousek kodu funguje
var=$(dialog --ascii-lines --menu "Hlavní menu" 0 100 0 \
1 "Obsluha Apache" \
2 "Obsluha MySQL" \
3 "Obsluha PHP" 2>&1 >/dev/tty)
Když ale nechci nic posílat do nějakého dev/tty (coz ani nevim co to presne je, jen jsem dohledal, ze se to tam posila pri nejake chybe) tak to proste smazu a v ten moment je script nefunkcni
var=$(dialog --ascii-lines --menu "Hlavní menu" 0 100 0 \
1 "Obsluha Apache" \
2 "Obsluha MySQL" \
3 "Obsluha PHP")
Poradí někdo správný zapis ? Díky

Ř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

14.6.2012 14:06 iKoulee | skóre: 19
Rozbalit Rozbalit vše Re: Bash a oprava scriptu
Odpovědět | | Sbalit | Link | Blokovat | Admin
$(...) znamena ze se prikaz spusti v subshellu, takze je potreba rict kam chcete dat vystup
var=$(dialog --ascii-lines --stdout --menu "Hlavní menu" 0 100 0 \
1 "Obsluha Apache" \
2 "Obsluha MySQL" \
3 "Obsluha PHP")
Even if you fall on your face, you’re still moving forward
14.6.2012 14:16 Othelo
Rozbalit Rozbalit vše Re: Bash a oprava scriptu
Děkuji a musím ten dialog spouštět v subshelu?

Když to udělám takto?
dialog --ascii-lines --menu "Hlavní menu" 0 100 0 \
1 "Obsluha Apache" \
2 "Obsluha MySQL" \
3 "Obsluha PHP"
Jak bych pak mohl třeba pomocí "case" rozlišit to na co se kliklo? Děkuji
14.6.2012 15:02 iKoulee | skóre: 19
Rozbalit Rozbalit vše Re: Bash a oprava scriptu
subshel se tady primo vybizi pouzit, pravdepodobne by se dalo pouzit i nejake zlo s pomoci pipe, ale subsel bude jednodussi a nejspsi i citelnejsi
case $var in
  1)
    echo "Indian";
    ;;
  2)
    echo "Muj dotazovaci jazyk";
    ;;
  3)
    echo "PHP: hypertextovy preprocesor";
    ;;
  *)
    echo "Vsechno vedle";
    ;;
esac
Even if you fall on your face, you’re still moving forward
14.6.2012 18:26 Othelo
Rozbalit Rozbalit vše Re: Bash a oprava scriptu
Děkuji za informace..

a když to budu chtít vypsat pomocí pole pro lepší pozdejsi upravu tak jsem to zkousel takto, do pole DATA dam nazvy polozek a do pole DATA2 co se spustit. Jenže to nejsem schopen sesmolit:( Zkoušel jsem kde co ale myslím, že se to dělá úplně jinak nez si myslím.. Poradíte ? Dík
DATA=("Obsluha Apache" "Obsluha MySQL" "Obsluha PHP")
DATA2=(apache mysql php)

var=$(dialog --ascii-lines --stdout --menu "Hlavní menu" 0 100 0 \

for i in ${!DATA[*]}
 do
  $i")" ${DATA[$i]}
 done)

case $var in
 for i in ${!DATA2[*]}
 do
  $i")" ${DATA2[$i]};;
 done
esac
14.6.2012 19:10 Kit
Rozbalit Rozbalit vše Re: Bash a oprava scriptu
Vždy je lepší dát k sobě řetězce "apache" a "Obsluha Apache" kvůli konzistenci programu. Zkus to přes dvojrozměrné pole nebo ještě lépe jako seznam dvojic.
15.6.2012 10:03 Kit
Rozbalit Rozbalit vše Re: Bash a oprava scriptu
A co tak to udělat triviálně?
var=$(dialog --ascii-lines --stdout --menu "Hlavní menu" 0 100 0 \
   apache "Obsluha Apache" \
   mysql "Obsluha MySQL" \
   php "Obsluha PHP")
$var
20.6.2012 14:53 iKoulee | skóre: 19
Rozbalit Rozbalit vše Re: Bash a oprava scriptu
Predstavujete si ten bash moc jako metaprogramovani :-)

Nasledujici postup plati pouze pro bash, pro jine shell kompatibilni interpretery fungovat nebude a je potreba to udelat trochu sloziteji.

Na vysvetlenou:
  • pouzil jsem asociativni pole, tento pristup se k tomu vybizi a neni to tak komplikovane jako prace s multidimenzionalnimi poli, nebo n-ticemi, ktere bash nativne nepodporuje a je tedy treba obcuravat zmenou $IFS atp.
  • pole ve kterem muzete mit volby ulozene pak projdeme for cyklem znasilnenym, tak aby se choval jako klasicky foreach
  • prikaz sestaveny v promnenne menuItems pak vyhodnotime za pomoci eval ktery se postara o spravne escapovane uvozovky, vysledek se spusti a dal je to jiz jasne
#!/bin/bash

declare -A descriptions=(
  [apache]="Obsluha Apache" \
  [mysql]="Obsluha MySQL" \
  [php]="Obsluha PHP");

menuItems="";
for key in ${!descriptions[@]}; do
  menuItems="$(echo $menuItems $key \"${descriptions[$key]}\")";
done;

echo $menuItems;
menuItems="dialog --ascii-lines --stdout --menu \"Hlavní menu\" 0 100 0 $menuItems";
var=$(eval $menuItems);
echo "Volba: $var";
Even if you fall on your face, you’re still moving forward
20.6.2012 14:59 iKoulee | skóre: 19
Rozbalit Rozbalit vše Re: Bash a oprava scriptu
jeste drobna oprava radek 10 je zbytecne slozity a nakladny, omylem jsem to stvoril za pomoci copy& paste, lepe takhle:
menuItems="$menuItems $key \"${descriptions[$key]}\"";
Even if you fall on your face, you’re still moving forward
14.6.2012 14:14 Petr Šobáň | skóre: 80 | blog: soban | Olomouc
Rozbalit Rozbalit vše Re: Bash a oprava scriptu
Odpovědět | | Sbalit | Link | Blokovat | Admin
No tak to pošli do /dev/null :-)

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.