Diskuze: Problém se scriptem

Linux a UNIX Linux Problém se scriptem

Avatar
Miro Koutný
Člen
Avatar
Miro Koutný:

Zdravím všechny, měl bych prosbu zda by mi někdo nemohl poradit kde mám chybu v kodu. Kod bych rozdělil do dvou části ta první kde se testuje zda je cesta k adresáři zadaná správně funguje jak má, ale jakmile přejde na podmínku tak se script ukončí. Tohle je můj první script a jsem celkem už bez nápadů. Díky za všechny rady, připomínky a návrhy.
PS : Podmínka má udělat to že podle zadaných hodnot 1 - 3 vypíše daný adresář bud : stručně, normálně, úplně.

 
Odpovědět 8. listopadu 20:35
Avatar
00
Člen
Avatar
00:

Zkus napsat podmínky do hranaté závorky.

 
Nahoru Odpovědět 8. listopadu 21:29
Avatar
00
Člen
Avatar
00:

Kdyžtak je tady tlačítko na vkládání kódu.

Závorka [ spouští program [, který se jinak jmenuje test. Kulatá ne

 
Nahoru Odpovědět  +1 8. listopadu 21:31
Avatar
Miro Koutný
Člen
Avatar
Miro Koutný:

Závorky jsem opravil hází to chybu Syntax Error: unexpected end of file
Těžko říct proč ... podmínky mám zavřené pomocí fi a 50x jsem to předělával a testoval a pořád nic takže fakt nevím.

 
Nahoru Odpovědět 8. listopadu 23:26
Avatar
Atrament
Člen
Avatar
Atrament:

Chybí ti středníky u ifů za podmínkou

if [ $UNAME != Linux ];
  then ....... atd. atd.
 
Nahoru Odpovědět 8. listopadu 23:36
Avatar
Miro Koutný
Člen
Avatar
Odpovídá na Atrament
Miro Koutný:

Pořád to nechodí ale... to mě štve

 
Nahoru Odpovědět 9. listopadu 0:25
Avatar
Atrament
Člen
Avatar
Atrament:

Nemůžeš sem ten skript postnout normálně jako zdroják?

 
Nahoru Odpovědět  +1 9. listopadu 0:41
Avatar
Miro Koutný
Člen
Avatar
Odpovídá na Atrament
Miro Koutný:
#!bin/bash
UNAME=$(uname)
if [ $UNAME != Linux ];
        then echo "Pracujete jinde nez v Linuxu"
        echo ""
fi
echo "Skript vypise obsah adresare"
echo "****************************"
echo "Zadejte zpusob vypsani adresare: POUZIJTE PRO TO CISLICE 1 AZ 3"
echo "1.Strucne"
echo "2.Normalne"
echo "3.Uplne"
echo "Zadejte cestu k adresari a pote stiknete ENTER!"
read CESTA
#KOntrola cesty k adresari
while [ ! -d "$CESTA" ]
do
        echo "Zadali jste chybnou cestu k adresari"
        echo "Zadejte novou cestu k adresari"
        read CESTA

echo "Zadejte jak chcete vypsat adresar"
read ODP
if [ $ODP = 1 ]
         then
         ls

else if [ $ODP = 2 ]
         ls -l

else if [ $ODP = 3 ]
         ll


fi
Editováno 9. listopadu 9:27
 
Nahoru Odpovědět 9. listopadu 9:24
Avatar
Atrament
Člen
Avatar
Odpovídá na Miro Koutný
Atrament:

Tak hned na začátku v shebangu ti chybí počáteční lomítko v cestě

#!/bin/bash

Dále, nejdříve požádáš uživatele o zadání způsobu výpisu, ale hned vzápětí ho žádáš o cestu. Nejprve tedy nech uživatele zadat, jakým způsobem se to bude vypisovat - přesuň to read ODP hned za to echo "3. Uplne". Taky bys možná mohl doplnit nějakou kontrolu, jestli uživatel zadal opravdu číslo 1 - 3.

Ten cyklus pro načtení správné cesty, jdeš na to dobře ale zbytečně složitě zkus to třeba takhle:

while [ ! -d $CESTA ] || [ -z $CESTA ];
do
  read -p "Zadejte cestu k adresari a pote stiknete ENTER!: " CESTA
  if [ ! -d $CESTA ]; then
    echo "Nezadali jste spravnou cestu. Znovu!"
  fi
done

ta podmínka za while znamená 'pokud soubor daný proměnnou CESTA není existující adresář nebo pokud je proměnná CESTA prázdná'. Jelikož ve chvíli prvního provádění této podmínky je proměnná CESTA prázdná a bash má tu zvlášní vlastnost, že za prázdnou cestu v podmínce si dosadí aktuální adresář, tak pokud bys tam neměl ten test na prázdnost proměnné CESTA, tak by uživatel nedostal možnost zadat svoji cestu, prostě by se použil aktuální adresář.

Poté co načteš správnou cestu je čas vypsat obsah adresáře podle toho co předtím uživatel zadal do proměnné ODP. Místo těch ifů (u kterých ti pořád mimochodem chybí ty středníky) použij konstrukci case, je to taková obdobá switche z 'normálních' programovacích jazyků. Pak by to mohlo vypadat takto:

case "$ODP" in
  1)
    ls $CESTA
    ;;
  2)
    ls -l $CESTA
    ;;
  3)
    ls -la $CESTA
    ;;
esac

Všimni si, že jsem ti upravil ten poslední případ na ls -la. ll je Ubuntí výmysl, je to pouhý alias na ls a nikde jinde pokud vím defaultně není, takže když bys to pustil na jiné distribuci tak by ti to nefungovalo. ls -la vypíše vše včetně skrytých souborů, takže to odpovídá tomu popisu 'Uplne'. Taky si všimni těch dvou středníků za každým případem, ty tam být musí, označují konec případu. Obvyklejší programovací jazyky místo nich používají 'break'.

 
Nahoru Odpovědět 9. listopadu 10:55
Avatar
Miro Koutný
Člen
Avatar
Odpovídá na Atrament
Miro Koutný:

Opravil jsem ti ify podle vás. Popravdě jsem ten kod upravoval XY hodin a pořád mi to házelo že unexpected token ´else´ takže ten case pomohl aspon. Ale pořád po zadání volby a zadání adresy adresáře se vyhodí chyba syntax error: unexpected end of file.
Doplnil jsem to otestování odpovědi pomocí příkazu until pokud by jste se na to ještě podíval byl bych vám vděčný.

#!/bin/bash
UNAME=$(uname)
if [ $UNAME != Linux ];
        then echo "Pracujete jinde nez v Linuxu"
        echo ""
fi
echo "Skript vypise obsah adresare"
echo "****************************"
echo "Zadejte zpusob vypsani adresare: POUZIJTE PRO TO CISLICE 1 AZ 3"
echo "1.Strucne"
echo "2.Normalne"
echo "3.Uplne"
read ODP
echo "Zadejte cestu k adresari a pote stiknete ENTER!"
read CESTA
#Kontrola cesty k adresari
while [ ! -d "$CESTA" ];
do
        echo "Zadali jste chybnou cestu k adresari"
        echo "Zadejte novou cestu k adresari"
        read CESTA

echo "Zadejte jak chcete vypsat adresar"
read ODP
#Vypsani
until [ $ODP <= 3 ];
do
echo "Zadali jste spatnou hodnotu. Zajdete te ji znovu!!!"
case "$ODP" in
1)
 ls $CESTA
 ;;
2)
 ls -l $CESTA
 ;;
3)
 ls -la $CESTA
 ;;
esac
 
Nahoru Odpovědět 9. listopadu 11:11
Avatar
gcx11
Redaktor
Avatar
Odpovídá na Miro Koutný
gcx11:

Ahoj, nechybí Ti tam pořád to done u while?

 
Nahoru Odpovědět 9. listopadu 11:24
Avatar
Miro Koutný
Člen
Avatar
Odpovídá na Atrament
Miro Koutný:

Ještě jsem vyměnil until za while a dal to nahoru at to má nějakou návaznost, ale zase to začalo psát: unexpected end of file na řádku 46 a řádek esac je řádek 45 takže chyba je na řádku, který je prázdný.

if [ $UNAME != Linux ];
        then echo "Pracujete jinde nez v Linuxu"
        echo ""
fi

echo "Skript vypise obsah adresare"
echo "****************************"
echo "Zadejte zpusob vypsani adresare: POUZIJTE PRO TO CISLICE 1 AZ 3"
echo "1.Strucne"
echo "2.Normalne"
echo "3.Uplne"
read ODP
while [ $ODP  > "3" ];
do
echo "Zadali jste spatnou hodnotu. Zajdete te ji znovu!"
echo "Zadejte znovu cislo!"
read ODP



echo "Zadejte cestu k adresari a pote stiknete ENTER!"
read CESTA
#Kontrola cesty k adresari
while [ ! -d "$CESTA" ];
do
        echo "Zadali jste chybnou cestu k adresari"
        echo "Zadejte novou cestu k adresari"
        read CESTA

read ODP
#Vypsani

case "$ODP" in
1)
 ls $CESTA
 ;;
2)
 ls -l $CESTA
 ;;
3)
 ls -la $CESTA
 ;;
esac
 
Nahoru Odpovědět 9. listopadu 11:32
Avatar
Miro Koutný
Člen
Avatar
Odpovídá na gcx11
Miro Koutný:

Už jsem ho tam dopsal jak jsem psal měním ten kod opravdu pořád a snažím se přijít na chyby. Jen to tu vše nechci dívat at zas tak moc nespamuji. Ale díky za připomínku. Dopsal jsem done za podmínku ODP > 3 ale i při zadání hodnoty která je menší jak 3 ( 1 - 3 ) mi to vyhodí echo" Zadali jste špatnou hodnotu..." a jsem v cyklu

 
Nahoru Odpovědět 9. listopadu 11:34
Avatar
Atrament
Člen
Avatar
Atrament:

No řekl bych že už jsi se s tím potrápil dost :)

#!/bin/bash
UNAME=$(uname)
if [ $UNAME != Linux ];
then echo "Pracujete jinde nez v Linuxu"
  echo ""
fi
echo "Skript vypise obsah adresare"
echo "****************************"
echo "Zadejte zpusob vypsani adresare: POUZIJTE PRO TO CISLICE 1 AZ 3"
echo "1.Strucne"
echo "2.Normalne"
echo "3.Uplne"

while (( ODP < 1  ||  ODP > 3 ));
do
  read -p "Zadejte jak chcete vypsat adresar: " ODP
  if (( ODP < 1 || ODP > 3 ));
  then
    echo "Prosim vyberte cislo 1 az 3!"
  fi
done

while [ ! -d "$CESTA" ] || [ -z "$CESTA" ];
do
  read -p "Zadejte cestu k adresari: " CESTA
  if [ ! -d "$CESTA" ]; then
    echo "Nezadal jste spravnou cestu. Znovu!"
  fi
done


case "$ODP" in
  1)
    ls "$CESTA"
    ;;
  2)
    ls -l "$CESTA"
    ;;
  3)
    ls -la "$CESTA"
    ;;
esac

Pro porovnávání čísel se v Bashi hodí více ty dvojité kulaté závorky jak jsem je použili já u načítání ODP. Klasické > a < v hranatých závorkách porovnává stringy abecedně.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 9. listopadu 12:08
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.