pátek 7. listopadu 2014

bash

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

Žádné komentáře:

Okomentovat