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
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