-
bash má přednastaveny některé systémové proměnné $HOME, $PATH..., vypsat je můžeme pomocí
echo $PATH
můžeme si nastavit své vlastní proměnné:
a=3;
b=4;
c="pejsek a kocicka";
d=soubor
odkud=/usr/html/NMIN266
na ně se můžeme odkazovat jednak výpisem jednak je můžeme použít v příkazech:
…
echo $a
echo $c
cp $odkud/5/tex.tar ~/NMIN266
…
Proměnné, které chceme používat při každém přihlášení si můžeme vložit do
souboru
.bash_profile
Příkazy můžeme psát přímo na příkazovou řádku, anebo do souboru (soubor začíná#!/bin/bash a musí mít nastavené právo x pro uživatele.
#bla bla - kromě prvního řádku se považuje za komentář
cv.
zkopírujte si soubor tex.tar (viz. výše) a rozbalte si ho (tar xvf tex.tar)
při práci s LaTeXem vznikají soubory *.log a *.aux, ty jsou pouze informativní ve chvíli
překladu, ale skladovat je nechceme – jednoduchý skript na smazání těchto souborů
vycisteni.sh
#!/bin/bash
rm *.log
rm *.aux
-
Čtení zadaných hodnot
read
#!/bin/bash
echo -n Jak se jmenujes:
read jmeno
echo -n ahoj $jmeno jak se vede. Jeste mi rekni kdy ses narodil:
read rok
vek=$[2024-$rok]
echo Aha tak to ti je $vek
-
Jednoduché matematické operace
a=1;
b=3;
c=`expr $a˽+˽$b`
anebo
c=$[3*$c]
pozn. mezera v příkazu expr je důležitá!!
-
Použití proměnných pro příkazy systému
c=pejsek
d=kocicka echo $c a $d #vypíše pejsek a kocicka
NMIN=${HOME}/NMIN266
cd; cd Mail; cd $NMIN
cp $odkud/5/5.3.tar.gz $NMIN
-
Uvozovky a proměnné:
echo "$c a $d" #vypíše pejsek a kočička
echo '$c a $d' #vypíše $c a $d
v případě, že za proměnnou nechceme mezeru, pak ji můžeme uzavřít do {}
-
Použití řetězce jako příkazu:
e=pwd
echo `$e` #vypíše aktuální adresář
-
proměnnou bash nejprve interpretuje a pak předá příslušnému příkazu
alias ll="ls -l"
touch a.tmp b.tmp c.tmp # vytvořili jsme si soubory a.tmp,b.tmp a c.tmp
d=*.tmp
ll $d
vypíše dlouhý výpis pro soubory a.tmp, b.tmp, c.tmp
touch d.tmp e.tmp f.tmp
rm $d # smaže a.tmp,b.tmp,c.tmp,d.tmp,e.tmp,f.tmp
-
Zapamatování si aktuálního adresáře
cd
cd NMIN266
cd fimfarum
aktualni=`pwd`
cd
pwd #jsem v ~/
cd $aktualni
jsem v ~/NMIN266/fimfarum
-
Podmínka
ab=ahoj
if [ $ab == "ahoj" ];
then
echo ahoj;
fi
-
Test existence souboru/adresáře:
cd #tj. jsme v domovském adresáři
htm=seznam1.txt
if [ -e $htm ];
then ls -l $htm;
else
echo soubor neexistuje;
fi
#vypíše, že soubor neexistuje
cd $NMIN
if [ -e $htm ]; then ls -l $htm; else echo soubor neexistuje; fi
#vypíše info o souboru seznam1.txt
další podmínky:
[ -d $adresar] #podmínka je splněna ve chvíli, kdy $adresar #je adresář
[ -L $soubor] #podmínka je splněna, když je $soubor symbolický link
[ -r $soubor] #podmínka je splněna, když je $soubor nastaven s právy pro čtení
[ -w $soubor] #podmínka je splněna, když je $soubor nastaven s právy pro zápis
[ -x $soubor] #podmínka je splněna, když je $soubor nastaven s právy pro spuštění
[ $a == $b ] #podmínka je splněna když se proměnné $a a $b rovnají
[ $a <> $b ] #podmínka je splněna když se proměnné $a a $b nerovnají
[ $a -ge $b ] #podmínka je splněna když se $a je větší nebo rovno $b
[ $a -le $b ] #podmínka je splněna když se $a je menší nebo rovno $b
[ $a -ge 10 -a $a -le 15 ] #podmínka je splněna když se $a je v rozmezí 10 a 15 včetně $b
-
cyklus for for "promněnná";do příkaz/příkazy;done
for f in 1 2 3;do echo $[2*$f];done #vypíše 2 4 6
for f in *.tex;do ls -l $f;done #?? co když, žádný *.tex neexistuje ... 2> /dev/null
anebo ošetřit pomocí existence souboru:
for f in *.tex;
do
if [ -e $f ]
then ls -l $f
fi
done
-
Smazání souborů *.log (ovšem ne jen v aktuálním adresáři)
for f in `find -name "*.log"`;
do
rm $f;
done
-
zkopírujte si soubor /usr/html/NMIN266/malapismena.tar.gz do ~/NMIN266
a tam ho pomocí příkazu tar -xzvf malapismena.tar.gz rozbalte, pak se přepněte do adresáře
mala
když to uděláte uvidíte, že názvy souborů jsou různě malá a velká písmena
for f in `find ./ -name "*"`; do ls -l $f; done # vypíše nám všechny soubory
vypsání jen souborů, které mají v názvu velké písmeno (grep):
for f in `find ./ -name "*" | grep [A-Z]`; do ls -l $f; done
pomocí příkazu tr můžeme přejmenovat všechny soubory tak, aby byly jen malými písmenky
echo ABC | tr "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz"
vytvořte skript mala.sh s tímto obsahem:
for f in `find ./ -name "*"`
do
mv $f `echo $f | tr "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz"
done
-
Předdefinované proměnné
název samotného skriptu $0
parametry skriptu $1 … $9
počet parametrů $#