Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Matěj 26. 11. 2017, 15:02:46

Název: Pomoc s napsáním podmínky
Přispěvatel: Matěj 26. 11. 2017, 15:02:46
Zdravím,

může mi prosím někdo pomoci napsat podmínku v bash? Potřebuji aby se podmínka splnila, pokud v adresáři /var/www neexistuje pouze jediná položka a to adresář. Moc děkuji pokud by někdo pomohl.
Název: Re:Pomoc s napsáním podmínky
Přispěvatel: Franta <xkucf03/> 26. 11. 2017, 15:43:54
Příkaz:
Kód: [Vybrat]
find -mindepth 1 -maxdepth 1 -type d | wc -lti vrátí počet adresářů. Když vynecháš -type d, tak ti to vrátí počet adresářů i dalších souborů. Z toho si to můžeš složit – čísla porovnáš s 1 a mezi sebou.
Název: Re:Pomoc s napsáním podmínky
Přispěvatel: petr 26. 11. 2017, 16:47:31
Nepotřebujete spíše pomoc s napsáním dotazu? Já ten Váš nejsem schopen pochopit.
Název: Re:Pomoc s napsáním podmínky
Přispěvatel: nu 26. 11. 2017, 16:56:51
Pošlu Vám podmínku pro adresář, ve kterém ji spustíte. Pro ten Váš si můžete upravit.
Kód: [Vybrat]
if [ $(ls -alF | grep -v  '[[:space:]]\.\{1,2\}\/$' | grep -c ^d) = "0" ]
then
echo "No directory!"
else
echo "Some dirs exists!"
fi
Název: Re:Pomoc s napsáním podmínky
Přispěvatel: nu 26. 11. 2017, 16:58:34
Ale jinak by bylo stejně jednodušší použít -d a potřebnou část programu napsat do bloku else.
Název: Re:Pomoc s napsáním podmínky
Přispěvatel: nu 26. 11. 2017, 17:11:13
Ale jinak by bylo stejně jednodušší použít -d a potřebnou část programu napsat do bloku else.
Tak asi kecám, s tím -d mi to nějak nejde zprovoznit.
Název: Re:Pomoc s napsáním podmínky
Přispěvatel: standa12345 28. 11. 2017, 01:15:41
základ:
ls -1F /var/www | grep -q "/$"
pokud existuje adresář, tak je RC 0, jinak >0

V ifu pak sekce:
ls -1F /var/www | grep -q "/$"
# bezprostredne nasledovane ifem
if [ $? -ne 0 ]; then
  echo "adresar NEexistuje"
fi


nebo:

if ls -1F /var/www | grep -q "/$"; then
  echo "adresar existuje"
else
  echo "adresar NEexistuje"
fi
Název: Re:Pomoc s napsáním podmínky
Přispěvatel: nu 28. 11. 2017, 20:22:58
základ:
ls -1F /var/www | grep -q "/$"
pokud existuje adresář, tak je RC 0, jinak >0

V ifu pak sekce:
ls -1F /var/www | grep -q "/$"
# bezprostredne nasledovane ifem
if [ $? -ne 0 ]; then
  echo "adresar NEexistuje"
fi


nebo:

if ls -1F /var/www | grep -q "/$"; then
  echo "adresar existuje"
else
  echo "adresar NEexistuje"
fi


Jen to má drobnou vadu, nenajde to skryté adresáře. Ale jinak pěkné zjednodušení...
Název: Re:Pomoc s napsáním podmínky
Přispěvatel: martin 29. 11. 2017, 11:03:33
Vzdycky kdyz vidim veci jako ls | grep tak se mi otaci oci vsloup. V 90% to neni potreba, zbytecne se nekolikrat vola fork a exec, zpusobi to plno zbytecnych cpu wakeups, a je to pomaly.
co treba neco jako
Kód: [Vybrat]
found=0; for i in /var/www/*; do [ -d "$i" ] && { found=1; break; }; done
if [ "$found" = 1 ]; then echo "Dirs"; else echo "No dirs"; fi
Název: Re:Pomoc s napsáním podmínky
Přispěvatel: Inkvizitor 29. 11. 2017, 12:45:57
Vzdycky kdyz vidim veci jako ls | grep tak se mi otaci oci vsloup. V 90% to neni potreba, zbytecne se nekolikrat vola fork a exec, zpusobi to plno zbytecnych cpu wakeups, a je to pomaly.
co treba neco jako
Kód: [Vybrat]
found=0; for i in /var/www/*; do [ -d "$i" ] && { found=1; break; }; done
if [ "$found" = 1 ]; then echo "Dirs"; else echo "No dirs"; fi

Jeste bych to prohnal profilerem, jestli neni mozno usetrit nekde par dalsich mikrosekund.
Název: Re:Pomoc s napsáním podmínky
Přispěvatel: nu 29. 11. 2017, 18:29:42
Vzdycky kdyz vidim veci jako ls | grep tak se mi otaci oci vsloup. V 90% to neni potreba, zbytecne se nekolikrat vola fork a exec, zpusobi to plno zbytecnych cpu wakeups, a je to pomaly.
co treba neco jako
Kód: [Vybrat]
found=0; for i in /var/www/*; do [ -d "$i" ] && { found=1; break; }; done
if [ "$found" = 1 ]; then echo "Dirs"; else echo "No dirs"; fi

Díky, takhle jsem se na ten problém nedíval. Já si to vždycky nadatluju tak, ať mi vypadne výsledek..
Název: Re:Pomoc s napsáním podmínky
Přispěvatel: j 29. 11. 2017, 19:48:55
Vzdycky kdyz vidim veci jako ls | grep tak se mi otaci oci vsloup. V 90% to neni potreba, zbytecne se nekolikrat vola fork a exec, zpusobi to plno zbytecnych cpu wakeups, a je to pomaly....
Vetsinou je to pro danej ucel uplne jedno. V tuxovi existuje prevazne nejmin 30 dalsich zpusobu jak to udelat, a ten efektivni je v 99% takovej, kterej zvladne dotycnej nejrychlejs napsat. Kdyby mel pokazdy zkoumat, jestli to nejde udelat lip a vykonejs, tak na kazdy pitomosti stravi hodiny casu.

A psat na tohle smycku ... megalol ... to bude tak o 2 rady pomalejsi.
Název: Re:Pomoc s napsáním podmínky
Přispěvatel: martin 29. 11. 2017, 22:34:29
Vetsinou je to pro danej ucel uplne jedno. V tuxovi existuje prevazne nejmin 30 dalsich zpusobu jak to udelat, a ten efektivni je v 99% takovej, kterej zvladne dotycnej nejrychlejs napsat. Kdyby mel pokazdy zkoumat, jestli to nejde udelat lip a vykonejs, tak na kazdy pitomosti stravi hodiny casu.

A psat na tohle smycku ... megalol ... to bude tak o 2 rady pomalejsi.
Ne, je to o navycich. Staci se naucit co a jak jde udelat primo v shellu bez volani externich utilit a v delsim skriptu je to sakra znat. Nebo pri volani ve smycce.

K tomu o 2 rady pomalejsi...

zk1.sh
Kód: [Vybrat]
#!/bin/bash
count=0
while [ "$count" -lt 500 ]; do
  ((count++))
  found=0; for i in /var/www/*; do [ -d "$i" ] && { found=1; break; }; done
done
if [ "$found" = 1 ]; then echo "Dirs"; else echo "No dirs"; fi
Kód: [Vybrat]
$ time ./zk1.sh
Dirs

real    0m0,016s
user    0m0,013s
sys     0m0,002s

zk2.sh
Kód: [Vybrat]
#!/bin/bash
count=0
while [ "$count" -lt 500 ]; do
  ((count++))
  found=0; ls -1F /var/www | grep -q "/$" && found=1
done
if [ "$found" = 1 ]; then echo "Dirs"; else echo "No dirs"; fi
Kód: [Vybrat]
$ time ./zk2.sh
Dirs                                       

real    0m0,432s                           
user    0m0,399s                           
sys     0m0,390s

Takze jsi uplne vedle.