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
Hence of this 2 large “ experts” specified while in the SMU Campus 7 days a week piece of writing – Bad guy as well as Cordain – one of these is without a doubt questionable by preferred in relation to research references (Hair), even while an individual was initially some reputable scientist though your partner's job has long been commonly refusted being an imprecise visualize in man chemistry and biology and likewise our ancestors diet habits. https://imgur.com/a/EOwOUNU https://imgur.com/a/GoODXWi https://imgur.com/a/69on0mh https://imgur.com/a/oCLGvvP https://imgur.com/a/UiLtUwb https://imgur.com/a/AXtfa9n https://imgur.com/a/UT19APU
OdpovědětVymazat