MOJE RESENI
#!/bin/bash
while [ $# -ge 1 ]
do
case $1 in
#vytvori soubor dle nazvu f1 a ulozi do nejpredposledni radku z /etc/passwd,dale do souboru zapise: Pocet radek: a pocetradek /etc/passwd
-a) cat /etc/passwd | tail -2 > $2
echo "Pocet radek: " >> $2
wc -l < /etc/passwd >> $2
shift ; shift
;;
#symbolicky link na soubor dany parametrem f1 nazvany dle parametru f2
-b) ln -s $2 $3
shift ; shift; shift
;;
#vytvori soubor cisla.txt obsahujici na kazde radce sestupne cisla 100,99,98 az 1
-c) cislo=100
while [ "$cislo" -ge 1 ]; do
echo $cislo >> cisla.txt
cislo=$((cislo - 1))
done
shift;
;;
-d) string="Hello World"
$ echo ${string,,} > $2 #to lower case
shift ; shift
;;
#prevede textovy soubor dany f1 na soubor f2 obsahujici jen velka pismena
-e) cat $2 |tr '[a-z]' '[A-Z]' >$3
shift ; shift; shift
;;
#zjisti rozdil mezi dvema soubory a zapise do tretiho souboru
-f) diff $2 $3 > $4
shift ; shift ; shift ; shift
;;
#tee kopiruje vystup do vice outputu {standard output a pak vsechny soubory dane jako parametry}
-h) cat | tee $2 > $3
shift ; shift ; shift
;;
#vytvori archiv komprimovany bzip2 a nazvany dle parametru
-i) tar -cjvf $2 ./UUR/*
shift; shift;
;;
#ulozi manualovou stranku k prikazu f1 do souboru daneho parametrem f2 a navic jeste prida priponu .man
-j) man $2 > $3.man
shift ; shift ; shift
;;
# bude ukladat vstup z klavesnice do souboru f1 a zaroven f2 (nikoliv prikazem cp), ukonceni vstupu je pres Ctrl+D
-k) cat | tee $2 > $3
shift ; shift ; shift
;;
#vypise na obrazovku vsechny soubory/adresare z aktualniho adresare, ktere maji v nazvu minimalne dva znaky a (nemusi byt za sebou)
-l) ls -dl *a*a*
shift
;;
#z textoveho souboru daneho parametrem f1 odebere prvni radek (resp. vysledkem bude soubor dany f1, z ktereho zmizi prvni radek)
# tento prvni radek odeslete e-mailem na svoji adresu
#http://en.kioskea.net/faq/1451-sed-delete-one-or-more-lines-from-a-file
-m) cat $2 | head -1 | mail terezahrc@gmail.com -s skript
cat $2 | sed '1d'|cat | tee $2
shift ; shift
;;
esac
done
NAKUP
http://www.abclinuxu.cz/clanky/navody/bash-v
cp - kopíruje soubory
rm - ruší soubory
tee - přesměruje výstup zároveň do souborů tee [options(-a append) ]... [file(s)]...
mkdir - vytváří adresáře
rmdir - ruší prázdné adresáře
ln - vytvoří odkazy na soubory
chmod - změní přístupová práva k souborům
ls, dir, vdir - vypíše obsah adresářů
find - vyhledávání souborů
which - zobrazí absolutní cestu k programu
df - vypisuje informace o připojených FS
ps - informace o spuštěných procesech
cat, less - výpis souboru na obrazovku
xargs - spustí zadaný příkaz a zbylé argumenty čte ze standardního vstupu
grep - tiskne řádky, které odpovídají zadanému vzoru
wc - vypíše počet písmen, slov a řádků
sort - setřídí řádky
grep, egrep, sed, ed, ex, awk.
$$ - PID shellu
$! - PID posledního procesu, který byl spuštěn na pozadí
$? - návratová hodnota posledního dokončeného procesu.
$0 - název skriptu
$# - počet předaných argumentů
$IFS - seznam znaků, který je použit k oddělování slov atp., např. když shell čte vstup
$1 až $9 - první až devátý argument předaný skriptu
${n} - libovolný n-tý argument předaný skriptu
$* - obsahuje všechny argumenty oddělené prvním znakem z $IFS
$@ - jako předchozí, ale k oddělení se nepoužívá první znak z $IFS
# Vypíše délku $ctvrta
echo ${#ctvrta}
# Od konce odstraní nejkraší část $ctvrta, která odpovídá e*
echo ${ctvrta%e*}
# Od konce odstraní nejdelší část $ctvrta, která odpovídá e*
echo ${ctvrta%%e*}
# Od začátku odstraní nejkraší část $ctvrta, která odpovídá *e
echo ${ctvrta#*e}
# Od začátku odstraní nejdelší část $ctvrta, která odpovídá e*
echo ${ctvrta##*e}
$ echo $promenna
./promenne.sh ./prvni.sh
$ echo '$promenna'
$promenna
$ echo "${promenna}vni.sh"
./*vni.sh
$ echo ${promenna}vni.sh
./prvni.sh
$ echo ${promenna}vni.pdf
./*vni.pdf
$ echo "$(echo $promenna) - výpis adresáře"
./promenne.sh ./prvni.sh - výpis adresáře
break - vyskočí z cyklu
: - nulový příkaz
continue - spustí další iteraci cyklu
. - provede příkaz v aktuálním shellu
eval - vyhodnotí zadaný výraz
shift - posune poziční parametry
read - načte uživatelský vstup, jako argument se použije název proměnné, do které se má uložit
stty - mění a vypisuje charakteristiky terminálové linky
exec - spustí nový shell nebo jiný zadaný program a nebo upraví deskriptor souboru
exit n - ukončení skriptu s návratovým kódem n (n = 0 - úspěšné ukončení, n = 1 až 125 - chyba, ostatní n jsou rezervovány)
printf - není dostupný ve starých shellech a při vytváření formátovaného výstupu byste mu měli dávat přednost před příkazem echo podle specifikace X/Open
-------------------------------------------------------PODMíNKY--------------------------------------------------
if [ "$USER" == "root" ]; then
echo "Ahoj admine";
elif [ "$USER" == "fuky" ]; then
echo "Ahoj Honzíku";
else
echo "Ahoj uživateli";
fi
[ výraz ] - délka řetězce je nenulová
[ -z výraz ] - délka řetězce je nulová
[ výraz1 == výraz2 ] - řetězce jsou shodné
[ výraz1 != výraz2 ] - řetězce jsou různé
[ výraz1 -eq výraz2 ] - čísla jsou shodná
[ výraz1 -le výraz2 ] - výraz1 <= výraz2
[ výraz1 -lt výraz2 ] - výraz1 < výraz2
[ výraz1 -ge výraz2 ] - výraz1 >= výraz2
[ výraz1 -gt výraz2 ] - výraz1 > výraz2
[ výraz1 -ne výraz2 ] - čísla jsou různé
Testování souborů.
[ výraz1 -ef výraz2 ] - soubory sdílejí stejný i-uzel
[ výraz1 -nt výraz2 ] - první soubor je novější
[ výraz1 -no výraz2 ] - první soubor je starší
[ -e výraz ] - soubor existuje
[ -d výraz ] - soubor je adresář
[ -f výraz ] - soubor je obyčejný soubor
[ -L výraz ] - soubor je symbolický odkaz
[ -w výraz ] - soubor je zapisovatelný
[ -x výraz ] - soubor je spustitelný
&& (a zároveň platí) a || (nebo platí).
----------------------------------------------------------REGULÁRNÍ VÝRAZY----------------------------------------
. - jakýkoliv znak (mimo znaku nového řádku)
* - libovolný počet (i nulový) opakování předchozího znaku (lze použít i regulární výraz)
^ - následující výraz musí odpovídat začátku řádku
$ - předchozí výraz musí odpovídat konci řádku
\ - vypíná speciální význam následujícího znaku
[] - jakýkoliv znak uvedený v hranatých závorkách, speciální znaky zde mají normální význam, mimo - tu lze použít pro zápis intervalů (a-z atd.) a znak ^ uvedený jako první způsobí negaci (tj. jakýkoliv znak neuvedený v ...)
Níže uvedené speciální znaky patří do novější notace a chceme-li je použít ve filtru grep, musíme před ně zapsat znak \.
+ - jeden a více výskytů předchozího výrazu.
? - jeden nebo žádný výskyt předchozího výrazu.
| - předcházející nebo následující výraz.
() - text odpovídající výrazu mezi závorkami se uloží do paměti a lze ho použít pomocí \1 až \9, čísluje se od vnějších závorek směrem dovnitř (např. ((abc)linuxu) \1 = "abclinuxu") a \2 = "abc". Nebo lze použít závorky k definování priority vyhodnocení.
{n,m} - interval opakování předchozího výrazu, {n} - opakuje se n-krát, {n,} n-krát a více, {n,m} n-krát až m-krát
$ cat << END > ./retezce.txt
> abclinuxu
> alfa
> aaa
> abcabcabc
> znak $
> a1a
> aAa
> END
$ cat ./retezce.txt | grep '.*'
abclinuxu
alfa
aaa
abcabcabc
znak $
a1a
aAa
$ cat ./retezce.txt | grep '.* \$'
znak $
$ cat ./retezce.txt | grep '^a[a-z]*a$'
alfa
aaa
$ cat ./retezce.txt | grep '^a[a-z0-9]*a$'
alfa
aaa
a1a
------------------------------------------------------METAZNAKY-------------------------------------------
* - libovolný řetězec (může být i nulové délky)
? - libovolný jeden znak
~ - domovský adresář ($HOME)
~UJ - domovský adresář uživatele UJ
~+ - aktuální pracovní adresář ($PWD)
~- - předchozí pracovní adresář ($OLDPWD)
[abc...] - jakýkoliv znak uvedený v [], lze použít - k zápisu intervalu znaků např a-z, 0-9
[!abc...] - opak předchozího (tj. jakýkoliv znak mimo uvedených znaků v [])
----------------------------------------------------LOOPS---------------------------------------------------------
#!/bin/bash
--------------FOR
# Vypíše všechny soubory v adresáři s příponou sh
for file in *.sh; do
# Soubor je samozřejmě i adresář a co když nějaký šílenec
# pojmenuje adresář jmeno_adresare.sh
if [ -f "$file" ]; then
echo $file
fi
done
# Do $cislo bude postupně dosazovat čísla
for cislo in 10 20 30 40 50 60 70 80 90 100; do
echo $cislo
done
-----------------------------WHILE
cislo=0
# Podmínka je splněna jestliže $cislo != 100
while [ "$cislo" -ne 100 ]; do
# Konstrukci $(()) zavedl shell ksh a je rychlejší a méně
# náročná na systémové zdroje než příkaz expr
cislo=$((cislo + 10))
echo $cislo
done
----------------------------------------------UNTIL
cislo=0
# Cyklus pokračuje dokud není splněna podmínka
until [ "$cislo" -eq 100 ]; do
cislo=$((cislo + 10))
echo $cislo
done
exit 0
-----------------------------------------------------------------------ARCHIVACE-------------------------------------
Příklad použití archivačního programu tar (je to standardní nástroj, takže ho naleznete snad v každé distribuci).
$ tar zcvf archiv.tgz ./adresar
./adresar/
./adresar/obesenec.sh
./adresar/oggwavmp3.sh
./adresar/archmed.sh
$ tar zxf archiv.tgz
$ tar jcf archiv.tar.bz2 ./adresar
$ tar jxf archiv.tar.bz2
Mimo archivace tar použije i kompresi z - gzip, j - bzip2. Volba x - rozbalí archív, c - vytvoří archív, v - vypisuje informace.
--------------------------------------------------------------PROUDY----------------------------------------------
Sed
Syntaxe příkazu:
Začátek,Konec!InstrukceArgumenty
Začátek - číslo řádku ($ značí poslední řádek) nebo /regulární výraz/
Konec - číslo řádku nebo /regulární výraz/
! - neguje předchozí body
Instrukce - mají jedno písmeno
Argumenty - k některým instrukcím
Není-li uveden Začátek a Konec, aplikuje se instrukce na každý vstupní řádek. Je-li uveden pouze Začátek, aplikuje se instrukce pouze na odpovídající řádek (či řádky) a je-li uvedeno obojí, tak od řádku odpovídajícímu Začátek se budou aplikovat instrukce a od řádku odpovídajícímu Konec se aplikovat přestanou. Níže jsou uvedeny některé Instrukce a jejich Argumenty.
s/vzorek/náhrada/příznaky - nahradí první nalezený vzorek náhradou. Příznaky: n - nahradí n-tý výskyt vzorku (1 až 512), g - nahradí všechny výskyty vzorku.
w soubor - do souboru uloží vstupní řádek (řádky)
r soubor - soubor načte do vstupu
p - vypíše vstupní řádek na výstup
n - přesune se na další vstupní řádek
d - vstupní řádek je smazán
y/původní znaky/nové znaky/ - přeloží znaky (man tr)
: - označí řádek skriptu pro odskok Instrukcí t nebo b
t - byla-li provedena substituce, skočí na následující značku :, není-li uvedena, skočí na konec skriptu
{} - zajistí aplikaci více příkazů na jednu adresu
$ cat ./retezce.txt | sed '2,$s/a/?/g'
abclinuxu
?lf?
???
?bc?bc?bc
zn?k $
?1?
?A?
$ cat ./retezce.txt | sed -n '2p'
alfa
$ cat ./retezce.txt | sed -n '1{
> n
> p
> }'
alfa
$ cat ./retezce.txt | sed '2p
> d'
alfa
$ cat ./retezce.txt | sed '4y/a/?/
> 4!d'
?bc?bc?bc
------------------------------------------------------------------------------------------------------------
$ find . \! -path './md5sum.txt' -type f | xargs -i md5sum {} > md5sum.txt
Program find předá programu xargs cestu ke všem souborům (na každém řádku je cesta k jednomu souboru), ten vezme řádek,
dá ho do uvozovek a předá jako argument programu md5sum, načte další řádek... Dokud nezpracuje celý vstup.
Standardní výstup programu md5sum se přesměruje do souboru md5sum.txt.
find
\! - neguje následující podmínku
-path './md5sum.txt' - najde soubory, jejichž jména odpovídají './md5sum.txt'
-type f - jsou nalezeny běžné soubory
xargs
-i - všechny výskyty dvojice znaků {} jsou nahrazeny cestou k souboru ze standardního vstupu,
mezery neuzavřené v uvozovkách nejsou považovány za ukončení argumentu
Je zbytečné psát takhle dlouhý příkaz, když ho budeme často používat. Proto si do souboru ~/.bashrc přídáme alias.
alias md5sumr='find . \! -path './md5sum.txt' -type f | xargs -i md5sum {} > md5sum.txt'
Po dalším spustění BASHE stačí, když zadáte jen md5sumr.
echo -n "Heslo: "
# Vypne výpis vstupních znaků
stty -echo
read heslo
# Zapne výpis vstupních
stty echo
echo
#!/bin/bash
while [ $# -ge 1 ]
do
case $1 in
#vytvori soubor dle nazvu f1 a ulozi do nejpredposledni radku z /etc/passwd,dale do souboru zapise: Pocet radek: a pocetradek /etc/passwd
-a) cat /etc/passwd | tail -2 > $2
echo "Pocet radek: " >> $2
wc -l < /etc/passwd >> $2
shift ; shift
;;
#symbolicky link na soubor dany parametrem f1 nazvany dle parametru f2
-b) ln -s $2 $3
shift ; shift; shift
;;
#vytvori soubor cisla.txt obsahujici na kazde radce sestupne cisla 100,99,98 az 1
-c) cislo=100
while [ "$cislo" -ge 1 ]; do
echo $cislo >> cisla.txt
cislo=$((cislo - 1))
done
shift;
;;
-d) string="Hello World"
$ echo ${string,,} > $2 #to lower case
shift ; shift
;;
#prevede textovy soubor dany f1 na soubor f2 obsahujici jen velka pismena
-e) cat $2 |tr '[a-z]' '[A-Z]' >$3
shift ; shift; shift
;;
#zjisti rozdil mezi dvema soubory a zapise do tretiho souboru
-f) diff $2 $3 > $4
shift ; shift ; shift ; shift
;;
#tee kopiruje vystup do vice outputu {standard output a pak vsechny soubory dane jako parametry}
-h) cat | tee $2 > $3
shift ; shift ; shift
;;
#vytvori archiv komprimovany bzip2 a nazvany dle parametru
-i) tar -cjvf $2 ./UUR/*
shift; shift;
;;
#ulozi manualovou stranku k prikazu f1 do souboru daneho parametrem f2 a navic jeste prida priponu .man
-j) man $2 > $3.man
shift ; shift ; shift
;;
# bude ukladat vstup z klavesnice do souboru f1 a zaroven f2 (nikoliv prikazem cp), ukonceni vstupu je pres Ctrl+D
-k) cat | tee $2 > $3
shift ; shift ; shift
;;
#vypise na obrazovku vsechny soubory/adresare z aktualniho adresare, ktere maji v nazvu minimalne dva znaky a (nemusi byt za sebou)
-l) ls -dl *a*a*
shift
;;
#z textoveho souboru daneho parametrem f1 odebere prvni radek (resp. vysledkem bude soubor dany f1, z ktereho zmizi prvni radek)
# tento prvni radek odeslete e-mailem na svoji adresu
#http://en.kioskea.net/faq/1451-sed-delete-one-or-more-lines-from-a-file
-m) cat $2 | head -1 | mail terezahrc@gmail.com -s skript
cat $2 | sed '1d'|cat | tee $2
shift ; shift
;;
esac
done
NAKUP
http://www.abclinuxu.cz/clanky/navody/bash-v
cp - kopíruje soubory
rm - ruší soubory
tee - přesměruje výstup zároveň do souborů tee [options(-a append) ]... [file(s)]...
mkdir - vytváří adresáře
rmdir - ruší prázdné adresáře
ln - vytvoří odkazy na soubory
chmod - změní přístupová práva k souborům
ls, dir, vdir - vypíše obsah adresářů
find - vyhledávání souborů
which - zobrazí absolutní cestu k programu
df - vypisuje informace o připojených FS
ps - informace o spuštěných procesech
cat, less - výpis souboru na obrazovku
xargs - spustí zadaný příkaz a zbylé argumenty čte ze standardního vstupu
grep - tiskne řádky, které odpovídají zadanému vzoru
wc - vypíše počet písmen, slov a řádků
sort - setřídí řádky
grep, egrep, sed, ed, ex, awk.
$$ - PID shellu
$! - PID posledního procesu, který byl spuštěn na pozadí
$? - návratová hodnota posledního dokončeného procesu.
$0 - název skriptu
$# - počet předaných argumentů
$IFS - seznam znaků, který je použit k oddělování slov atp., např. když shell čte vstup
$1 až $9 - první až devátý argument předaný skriptu
${n} - libovolný n-tý argument předaný skriptu
$* - obsahuje všechny argumenty oddělené prvním znakem z $IFS
$@ - jako předchozí, ale k oddělení se nepoužívá první znak z $IFS
# Vypíše délku $ctvrta
echo ${#ctvrta}
# Od konce odstraní nejkraší část $ctvrta, která odpovídá e*
echo ${ctvrta%e*}
# Od konce odstraní nejdelší část $ctvrta, která odpovídá e*
echo ${ctvrta%%e*}
# Od začátku odstraní nejkraší část $ctvrta, která odpovídá *e
echo ${ctvrta#*e}
# Od začátku odstraní nejdelší část $ctvrta, která odpovídá e*
echo ${ctvrta##*e}
$ echo $promenna
./promenne.sh ./prvni.sh
$ echo '$promenna'
$promenna
$ echo "${promenna}vni.sh"
./*vni.sh
$ echo ${promenna}vni.sh
./prvni.sh
$ echo ${promenna}vni.pdf
./*vni.pdf
$ echo "$(echo $promenna) - výpis adresáře"
./promenne.sh ./prvni.sh - výpis adresáře
break - vyskočí z cyklu
: - nulový příkaz
continue - spustí další iteraci cyklu
. - provede příkaz v aktuálním shellu
eval - vyhodnotí zadaný výraz
shift - posune poziční parametry
read - načte uživatelský vstup, jako argument se použije název proměnné, do které se má uložit
stty - mění a vypisuje charakteristiky terminálové linky
exec - spustí nový shell nebo jiný zadaný program a nebo upraví deskriptor souboru
exit n - ukončení skriptu s návratovým kódem n (n = 0 - úspěšné ukončení, n = 1 až 125 - chyba, ostatní n jsou rezervovány)
printf - není dostupný ve starých shellech a při vytváření formátovaného výstupu byste mu měli dávat přednost před příkazem echo podle specifikace X/Open
-------------------------------------------------------PODMíNKY--------------------------------------------------
if [ "$USER" == "root" ]; then
echo "Ahoj admine";
elif [ "$USER" == "fuky" ]; then
echo "Ahoj Honzíku";
else
echo "Ahoj uživateli";
fi
[ výraz ] - délka řetězce je nenulová
[ -z výraz ] - délka řetězce je nulová
[ výraz1 == výraz2 ] - řetězce jsou shodné
[ výraz1 != výraz2 ] - řetězce jsou různé
[ výraz1 -eq výraz2 ] - čísla jsou shodná
[ výraz1 -le výraz2 ] - výraz1 <= výraz2
[ výraz1 -lt výraz2 ] - výraz1 < výraz2
[ výraz1 -ge výraz2 ] - výraz1 >= výraz2
[ výraz1 -gt výraz2 ] - výraz1 > výraz2
[ výraz1 -ne výraz2 ] - čísla jsou různé
Testování souborů.
[ výraz1 -ef výraz2 ] - soubory sdílejí stejný i-uzel
[ výraz1 -nt výraz2 ] - první soubor je novější
[ výraz1 -no výraz2 ] - první soubor je starší
[ -e výraz ] - soubor existuje
[ -d výraz ] - soubor je adresář
[ -f výraz ] - soubor je obyčejný soubor
[ -L výraz ] - soubor je symbolický odkaz
[ -w výraz ] - soubor je zapisovatelný
[ -x výraz ] - soubor je spustitelný
&& (a zároveň platí) a || (nebo platí).
----------------------------------------------------------REGULÁRNÍ VÝRAZY----------------------------------------
. - jakýkoliv znak (mimo znaku nového řádku)
* - libovolný počet (i nulový) opakování předchozího znaku (lze použít i regulární výraz)
^ - následující výraz musí odpovídat začátku řádku
$ - předchozí výraz musí odpovídat konci řádku
\ - vypíná speciální význam následujícího znaku
[] - jakýkoliv znak uvedený v hranatých závorkách, speciální znaky zde mají normální význam, mimo - tu lze použít pro zápis intervalů (a-z atd.) a znak ^ uvedený jako první způsobí negaci (tj. jakýkoliv znak neuvedený v ...)
Níže uvedené speciální znaky patří do novější notace a chceme-li je použít ve filtru grep, musíme před ně zapsat znak \.
+ - jeden a více výskytů předchozího výrazu.
? - jeden nebo žádný výskyt předchozího výrazu.
| - předcházející nebo následující výraz.
() - text odpovídající výrazu mezi závorkami se uloží do paměti a lze ho použít pomocí \1 až \9, čísluje se od vnějších závorek směrem dovnitř (např. ((abc)linuxu) \1 = "abclinuxu") a \2 = "abc". Nebo lze použít závorky k definování priority vyhodnocení.
{n,m} - interval opakování předchozího výrazu, {n} - opakuje se n-krát, {n,} n-krát a více, {n,m} n-krát až m-krát
$ cat << END > ./retezce.txt
> abclinuxu
> alfa
> aaa
> abcabcabc
> znak $
> a1a
> aAa
> END
$ cat ./retezce.txt | grep '.*'
abclinuxu
alfa
aaa
abcabcabc
znak $
a1a
aAa
$ cat ./retezce.txt | grep '.* \$'
znak $
$ cat ./retezce.txt | grep '^a[a-z]*a$'
alfa
aaa
$ cat ./retezce.txt | grep '^a[a-z0-9]*a$'
alfa
aaa
a1a
------------------------------------------------------METAZNAKY-------------------------------------------
* - libovolný řetězec (může být i nulové délky)
? - libovolný jeden znak
~ - domovský adresář ($HOME)
~UJ - domovský adresář uživatele UJ
~+ - aktuální pracovní adresář ($PWD)
~- - předchozí pracovní adresář ($OLDPWD)
[abc...] - jakýkoliv znak uvedený v [], lze použít - k zápisu intervalu znaků např a-z, 0-9
[!abc...] - opak předchozího (tj. jakýkoliv znak mimo uvedených znaků v [])
----------------------------------------------------LOOPS---------------------------------------------------------
#!/bin/bash
--------------FOR
# Vypíše všechny soubory v adresáři s příponou sh
for file in *.sh; do
# Soubor je samozřejmě i adresář a co když nějaký šílenec
# pojmenuje adresář jmeno_adresare.sh
if [ -f "$file" ]; then
echo $file
fi
done
# Do $cislo bude postupně dosazovat čísla
for cislo in 10 20 30 40 50 60 70 80 90 100; do
echo $cislo
done
-----------------------------WHILE
cislo=0
# Podmínka je splněna jestliže $cislo != 100
while [ "$cislo" -ne 100 ]; do
# Konstrukci $(()) zavedl shell ksh a je rychlejší a méně
# náročná na systémové zdroje než příkaz expr
cislo=$((cislo + 10))
echo $cislo
done
----------------------------------------------UNTIL
cislo=0
# Cyklus pokračuje dokud není splněna podmínka
until [ "$cislo" -eq 100 ]; do
cislo=$((cislo + 10))
echo $cislo
done
exit 0
-----------------------------------------------------------------------ARCHIVACE-------------------------------------
Příklad použití archivačního programu tar (je to standardní nástroj, takže ho naleznete snad v každé distribuci).
$ tar zcvf archiv.tgz ./adresar
./adresar/
./adresar/obesenec.sh
./adresar/oggwavmp3.sh
./adresar/archmed.sh
$ tar zxf archiv.tgz
$ tar jcf archiv.tar.bz2 ./adresar
$ tar jxf archiv.tar.bz2
Mimo archivace tar použije i kompresi z - gzip, j - bzip2. Volba x - rozbalí archív, c - vytvoří archív, v - vypisuje informace.
--------------------------------------------------------------PROUDY----------------------------------------------
Sed
Syntaxe příkazu:
Začátek,Konec!InstrukceArgumenty
Začátek - číslo řádku ($ značí poslední řádek) nebo /regulární výraz/
Konec - číslo řádku nebo /regulární výraz/
! - neguje předchozí body
Instrukce - mají jedno písmeno
Argumenty - k některým instrukcím
Není-li uveden Začátek a Konec, aplikuje se instrukce na každý vstupní řádek. Je-li uveden pouze Začátek, aplikuje se instrukce pouze na odpovídající řádek (či řádky) a je-li uvedeno obojí, tak od řádku odpovídajícímu Začátek se budou aplikovat instrukce a od řádku odpovídajícímu Konec se aplikovat přestanou. Níže jsou uvedeny některé Instrukce a jejich Argumenty.
s/vzorek/náhrada/příznaky - nahradí první nalezený vzorek náhradou. Příznaky: n - nahradí n-tý výskyt vzorku (1 až 512), g - nahradí všechny výskyty vzorku.
w soubor - do souboru uloží vstupní řádek (řádky)
r soubor - soubor načte do vstupu
p - vypíše vstupní řádek na výstup
n - přesune se na další vstupní řádek
d - vstupní řádek je smazán
y/původní znaky/nové znaky/ - přeloží znaky (man tr)
: - označí řádek skriptu pro odskok Instrukcí t nebo b
t - byla-li provedena substituce, skočí na následující značku :, není-li uvedena, skočí na konec skriptu
{} - zajistí aplikaci více příkazů na jednu adresu
$ cat ./retezce.txt | sed '2,$s/a/?/g'
abclinuxu
?lf?
???
?bc?bc?bc
zn?k $
?1?
?A?
$ cat ./retezce.txt | sed -n '2p'
alfa
$ cat ./retezce.txt | sed -n '1{
> n
> p
> }'
alfa
$ cat ./retezce.txt | sed '2p
> d'
alfa
$ cat ./retezce.txt | sed '4y/a/?/
> 4!d'
?bc?bc?bc
------------------------------------------------------------------------------------------------------------
$ find . \! -path './md5sum.txt' -type f | xargs -i md5sum {} > md5sum.txt
Program find předá programu xargs cestu ke všem souborům (na každém řádku je cesta k jednomu souboru), ten vezme řádek,
dá ho do uvozovek a předá jako argument programu md5sum, načte další řádek... Dokud nezpracuje celý vstup.
Standardní výstup programu md5sum se přesměruje do souboru md5sum.txt.
find
\! - neguje následující podmínku
-path './md5sum.txt' - najde soubory, jejichž jména odpovídají './md5sum.txt'
-type f - jsou nalezeny běžné soubory
xargs
-i - všechny výskyty dvojice znaků {} jsou nahrazeny cestou k souboru ze standardního vstupu,
mezery neuzavřené v uvozovkách nejsou považovány za ukončení argumentu
Je zbytečné psát takhle dlouhý příkaz, když ho budeme často používat. Proto si do souboru ~/.bashrc přídáme alias.
alias md5sumr='find . \! -path './md5sum.txt' -type f | xargs -i md5sum {} > md5sum.txt'
Po dalším spustění BASHE stačí, když zadáte jen md5sumr.
echo -n "Heslo: "
# Vypne výpis vstupních znaků
stty -echo
read heslo
# Zapne výpis vstupních
stty echo
echo
Žádné komentáře:
Okomentovat