← Vissza

Bash – Hello World

Egyszerű script, amely kiírja a „Hello world!” üzenetet:

#!/bin/bash

VAR="world"
echo "Hello $VAR!"   # => Hello world!

# futtatás:
bash hello.sh

Bash – Változók

Változók létrehozása és kiírása:

NAME="John"

echo ${NAME}     # => John
echo $NAME       # => John
echo "$NAME"     # => John
echo '$NAME'     # => $NAME (szöveg)
echo "${NAME}!"  # => John!

NAME = "John"    # => Hiba (szóköz miatt)

Bash – Kommentek

Egysoros és többsoros kommentek:

# Ez egy egysoros komment

: '
Ez egy
többsoros komment
bash-ben
'

Bash – Argumentumok

Speciális paraméterek és argumentumok:

$0   # script neve
$1   # első argumentum
${10} # 10. argumentum
$#   # argumentumok száma
$$   # shell PID
$*   # összes argumentum
$@   # összes argumentum külön
$_   # előző parancs utolsó argumentuma

Bash – Függvények

Egyszerű függvény létrehozása és meghívása:

get_name() {
    echo "John"
}

echo "You are $(get_name)"

Bash – Feltételek

Egyszerű feltételes szerkezet:

if [[ -z "$string" ]]; then
    echo "String is empty"
elif [[ -n "$string" ]]; then
    echo "String is not empty"
fi

Bash – Brace expansion

Szövegek és számok generálása:

echo {A,B}       # => A B
echo {A,B}.js    # => A.js B.js
echo {1..5}      # => 1 2 3 4 5

Bash – Parancs behelyettesítés

Parancs futtatása és eredményének behelyettesítése:

echo "I'm in $(pwd)"
# vagy
echo "I'm in `pwd`"

Bash – Parameter Expansion szintaxis

Alapvető műveletek változókkal:

${FOO%suffix}    # suffix eltávolítása
${FOO#prefix}    # prefix eltávolítása
${FOO%%suffix}   # hosszú suffix eltávolítása
${FOO##prefix}   # hosszú prefix eltávolítása
${FOO/from/to}   # első találat cseréje
${FOO//from/to}  # összes találat cseréje
${FOO/%from/to}  # suffix cseréje
${FOO/#from/to}  # prefix cseréje

Bash – Részsztringek

Változó részleteinek kiemelése:

${FOO:0:3}      # substring (pozíció, hossz)
${FOO:(-3):3}   # substring jobbról

Bash – Hossz

Változó hosszának lekérése:

${#FOO}   # $FOO hossza

Bash – Alapértelmezett értékek

Értékek kezelése unset változóknál:

${FOO:-val}   # $FOO vagy val, ha unset
${FOO:=val}   # beállítja $FOO-t val-ra, ha unset
${FOO:+val}   # val, ha $FOO be van állítva
${FOO:?msg}   # hibaüzenet, ha unset

Bash – Példák substitution

Gyakorlati példák:

echo ${food:-Cake}   # $food vagy "Cake"

STR="/path/to/foo.cpp"
echo ${STR%.cpp}     # /path/to/foo
echo ${STR%.cpp}.o   # /path/to/foo.o
echo ${STR%/*}       # /path/to
echo ${STR##*.}      # cpp (kiterjesztés)
echo ${STR##*/}      # foo.cpp (fájlnév)
echo ${STR/foo/bar}  # /path/to/bar.cpp

Bash – Slicing

Sztringek szeletelése:

name="John"
echo ${name:0:2}       # Jo
echo ${name::2}        # Jo
echo ${name::-1}       # Joh
echo ${name:(-1)}      # n
echo ${name:(-2)}      # hn
echo ${name:(-2):2}    # hn

length=2
echo ${name:0:length}  # Jo

Bash – Basepath & Dirpath

Fájlnév és könyvtár kiemelése:

SRC="/path/to/foo.cpp"

BASEPATH=${SRC##*/}   
echo $BASEPATH   # foo.cpp

DIRPATH=${SRC%$BASEPATH}
echo $DIRPATH    # /path/to/

Bash – Transzformáció

Betűk átalakítása kis- és nagybetűvé:

STR="HELLO WORLD!"
echo ${STR,}    # hELLO WORLD!
echo ${STR,,}   # hello world!

STR="hello world!"
echo ${STR^}    # Hello world!
echo ${STR^^}   # HELLO WORLD!

ARR=(hello World)
echo "${ARR[@],}" # hello world
echo "${ARR[@]^}" # Hello World

Bash – Tömbök definiálása

Tömbök létrehozása és összevonása:

Fruits=('Apple' 'Banana' 'Orange')

Fruits[0]="Apple"
Fruits[1]="Banana"
Fruits[2]="Orange"

ARRAY1=(foo{1..2})   # foo1 foo2
ARRAY2=({A..D})      # A B C D
ARRAY3=(${ARRAY1[@]} ${ARRAY2[@]}) # Merge

declare -a Numbers=(1 2 3)
Numbers+=(4 5)       # Append => 1 2 3 4 5

Bash – Indexelés

Tömb elemek elérése és hossza:

${Fruits[0]}     # első elem
${Fruits[-1]}    # utolsó elem
${Fruits[*]}     # összes elem
${Fruits[@]}     # összes elem
${#Fruits[@]}    # elemszám
${#Fruits}       # első elem hossza
${#Fruits[3]}    # n. elem hossza
${Fruits[@]:3:2} # tartomány
${!Fruits[@]}    # indexek

Bash – Iteráció

Tömb bejárása értékekkel és indexekkel:

Fruits=('Apple' 'Banana' 'Orange')

for e in "${Fruits[@]}"; do
    echo $e
done

for i in "${!Fruits[@]}"; do
  printf "%s\t%s\n" "$i" "${Fruits[$i]}"
done

Bash – Műveletek

Tömbök módosítása és kombinálása:

Fruits=("${Fruits[@]}" "Watermelon")   # Push
Fruits+=('Watermelon')                 # Push
Fruits=( ${Fruits[@]/Ap*/} )           # Regex remove
unset Fruits[2]                        # Elem törlése
Fruits=("${Fruits[@]}")                # Duplikálás
Fruits=("${Fruits[@]}" "${Veggies[@]}")# Konkatenáció
lines=(`cat "logfile"`)                # Fájl beolvasás

Bash – Tömbök argumentumként

Tömb átadása függvénynek:

function extract()
{
    local -n myarray=$1
    local idx=$2
    echo "${myarray[$idx]}"
}

Fruits=('Apple' 'Banana' 'Orange')
extract Fruits 2   # => Orange

Bash – Szótárak definiálása

Asszociatív tömb létrehozása és feltöltése:

declare -A sounds

sounds[dog]="bark"
sounds[cow]="moo"
sounds[bird]="tweet"
sounds[wolf]="howl"

Bash – Szótárak használata

Értékek, kulcsok és elemszám kezelése:

echo ${sounds[dog]}   # Dog's sound
echo ${sounds[@]}     # Összes érték
echo ${!sounds[@]}    # Összes kulcs
echo ${#sounds[@]}    # Elemek száma
unset sounds[dog]     # Elem törlése

Bash – Szótárak iterációja

Bejárás értékekkel és kulcsokkal:

for val in "${sounds[@]}"; do
    echo $val
done

for key in "${!sounds[@]}"; do
    echo $key
done

Bash – Egész szám feltételek

Számok összehasonlítása:

[[ NUM -eq NUM ]]   # egyenlő
[[ NUM -ne NUM ]]   # nem egyenlő
[[ NUM -lt NUM ]]   # kisebb
[[ NUM -le NUM ]]   # kisebb vagy egyenlő
[[ NUM -gt NUM ]]   # nagyobb
[[ NUM -ge NUM ]]   # nagyobb vagy egyenlő

(( NUM < NUM ))     # kisebb
(( NUM <= NUM ))    # kisebb vagy egyenlő
(( NUM > NUM ))     # nagyobb
(( NUM >= NUM ))    # nagyobb vagy egyenlő

Bash – Sztring feltételek

Szövegek összehasonlítása:

[[ -z STR ]]   # üres
[[ -n STR ]]   # nem üres
[[ STR == STR ]] # egyenlő
[[ STR != STR ]] # nem egyenlő
[[ STR < STR ]]  # kisebb ASCII
[[ STR > STR ]]  # nagyobb ASCII
[[ STR =~ STR ]] # regexp

Bash – Feltételes példák

Gyakorlati példák:

if [[ -z "$string" ]]; then
    echo "String is empty"
elif [[ -n "$string" ]]; then
    echo "String is not empty"
fi

if [[ "$A" == "$B" ]]; then
    ...
fi

if [[ '1. abc' =~ ([a-z]+) ]]; then
    echo ${BASH_REMATCH[1]}
fi

if (( $a < $b )); then
   echo "$a is smaller than $b"
fi

if [[ -e "file.txt" ]]; then
    echo "file exists"
fi

Bash – Fájl feltételek

Fájlok és könyvtárak ellenőrzése:

[[ -e FILE ]]   # létezik
[[ -d FILE ]]   # könyvtár
[[ -f FILE ]]   # fájl
[[ -h FILE ]]   # symlink
[[ -s FILE ]]   # méret > 0
[[ -r FILE ]]   # olvasható
[[ -w FILE ]]   # írható
[[ -x FILE ]]   # futtatható
[[ f1 -nt f2 ]] # f1 újabb
[[ f1 -ot f2 ]] # f2 régebbi
[[ f1 -ef f2 ]] # azonos fájl

Bash – Logikai műveletek

Logikai kombinációk:

[[ ! EXPR ]]   # NOT
[[ X && Y ]]   # AND
[[ X || Y ]]   # OR

if [ "$1" = 'y' -a $2 -gt 0 ]; then
    echo "yes"
fi

if [ "$1" = 'n' -o $2 -lt 0 ]; then
    echo "no"
fi

Bash – Alap for ciklus

Egyszerű for ciklus fájlok bejárására:

for i in /etc/rc.*; do
    echo $i
done

Bash – C-szerű for ciklus

Számlálóval vezérelt for ciklus:

for ((i = 0 ; i < 100 ; i++)); do
    echo $i
done

Bash – Tartományok

Számok bejárása tartományban:

for i in {1..5}; do
    echo "Welcome $i"
done

Bash – Lépésköz

Tartomány bejárása adott lépésközzel:

for i in {5..50..5}; do
    echo "Welcome $i"
done

Bash – Auto increment

While ciklus számláló növelésével:

i=1
while [[ $i -lt 4 ]]; do
    echo "Number: $i"
    ((i++))
done

Bash – Auto decrement

While ciklus számláló csökkentésével:

i=3
while [[ $i -gt 0 ]]; do
    echo "Number: $i"
    ((i--))
done

Bash – Continue

Elemek kihagyása ciklusban:

for number in $(seq 1 3); do
    if [[ $number == 2 ]]; then
        continue
    fi
    echo "$number"
done

Bash – Break

Ciklus megszakítása:

for number in $(seq 1 3); do
    if [[ $number == 2 ]]; then
        break
    fi
    echo "$number"   # csak 1-et ír ki
done

Bash – Until ciklus

Ciklus futtatása amíg a feltétel hamis:

count=0
until [ $count -gt 10 ]; do
    echo "$count"
    ((count++))
done

Bash – Végtelen ciklus

Végtelen while ciklus:

while true; do
    # kód
done

# rövidített forma
while :; do
    # kód
done

Bash – Sorok olvasása

Fájl sorainak bejárása:

cat file.txt | while read line; do
    echo $line
done

Bash – Függvény definiálása

Függvény létrehozása kétféle szintaxissal:

myfunc() {
    echo "hello $1"
}

# alternatív szintaxis
function myfunc() {
    echo "hello $1"
}

myfunc "John"

Bash – Érték visszaadása

Függvényből érték visszaadása:

myfunc() {
    local myresult='some value'
    echo $myresult
}

result="$(myfunc)"

Bash – Hibakezelés

Függvény hibát jelez return kóddal:

myfunc() {
    return 1
}

if myfunc; then
    echo "success"
else
    echo "failure"
fi

Bash – Alap opciók

Hasznos shell opciók hibakezeléshez:

set -o noclobber   # fájlok felülírásának tiltása
set -o errexit     # kilépés hiba esetén
set -o pipefail    # pipe hibák feltárása
set -o nounset     # unset változók hibát okoznak

Bash – Glob opciók

Glob minták viselkedésének beállítása:

shopt -s nullglob    # nem illeszkedő glob törlődik
shopt -s failglob    # nem illeszkedő glob hiba
shopt -s nocaseglob  # kis/nagybetű érzéketlen
shopt -s dotglob     # wildcard illeszti a dotfile-okat
shopt -s globstar    # ** rekurzív illesztés

Bash – History parancsok

Parancstörténet kezelése:

history          # előzmények listázása
sudo !!          # előző parancs sudo-val
shopt -s histverify # expandált parancs nem fut azonnal

Bash – History expansions

Előző parancs argumentumainak kibővítése:

!$      # utolsó argumentum
!*      # összes argumentum
!-n     # n-edik legutóbbi parancs
!n      # n-edik parancs
!  # legutóbbi adott parancs

Bash – History műveletek

Előző parancs újrafuttatása és módosítása:

!!                 # utolsó parancs újra
!!:s/FROM/TO/      # első előfordulás cseréje
!!:gs/FROM/TO/     # összes előfordulás cseréje
!$:t               # utolsó argumentum basename
!$:h               # utolsó argumentum könyvtár

Bash – History slices

Argumentumok szeletelése előző parancsból:

!!:n      # n-edik token
!^        # első argumentum
!$        # utolsó token
!!:n-m    # tartomány
!!:n-$    # n-ediktől az utolsóig

Bash – Numerikus számítások

Egyszerű aritmetikai műveletek:

$((a + 200))       # hozzáad 200-at $a-hoz
$(($RANDOM%200))   # véletlen szám 0..199

Bash – Subshells

Parancs futtatása külön subshellben:

(cd somedir; echo "I'm now in $PWD")
pwd   # továbbra is az eredeti könyvtárban

Bash – Parancsok vizsgálata

Parancs típusának ellenőrzése:

command -V cd
# => "cd is a function/alias/whatever"

Bash – Átirányítások

Standard output és error kezelése:

python hello.py > output.txt    # stdout fájlba
python hello.py >> output.txt   # stdout fájlba, hozzáfűzés
python hello.py 2> error.log    # stderr fájlba
python hello.py 2>&1            # stderr stdout-ra
python hello.py 2>/dev/null     # stderr null-ra
python hello.py &>/dev/null     # stdout+stderr null-ra
python hello.py < foo.txt       # stdin fájlból

Bash – Source relative & Directory

Script könyvtárának meghatározása:

source "${0%/*}/../share/foo.sh"

DIR="${0%/*}"

Bash – Case / Switch

Elágazás case szerkezettel:

case "$1" in
    start | up)
        vagrant up
        ;;
    *)
        echo "Usage: $0 {start|stop|ssh}"
        ;;
esac

Bash – Hibakezelés trap-pel

Hibák elkapása trap segítségével:

trap 'echo Error at about $LINENO' ERR

traperr() {
    echo "ERROR: ${BASH_SOURCE[1]} at about ${BASH_LINENO[0]}"
}
set -o errtrace
trap traperr ERR

Bash – printf

Formázott kiírás:

printf "Hello %s, I'm %s" Sven Olga
# => Hello Sven, I'm Olga

printf "1 + 1 = %d" 2
# => 1 + 1 = 2

printf "Print a float: %f" 2
# => Print a float: 2.000000

Bash – Opciók feldolgozása

Parancssori opciók kezelése:

while [[ "$1" =~ ^- && ! "$1" == "--" ]]; do case $1 in
    -V | --version )
        echo $version; exit ;;
    -s | --string )
        shift; string=$1 ;;
    -f | --flag )
        flag=1 ;;
esac; shift; done
if [[ "$1" == '--' ]]; then shift; fi

Bash – Parancs eredményének ellenőrzése

Parancs sikerességének vizsgálata:

if ping -c 1 google.com; then
    echo "It appears you have a working internet connection"
fi

Bash – Speciális változók

Hasznos shell változók:

$?   # utolsó task exit státusza
$!   # utolsó háttérfolyamat PID-je
$$   # shell PID
$0   # script fájlneve

Bash – Grep check

Előzmények vizsgálata grep-pel:

if grep -q 'foo' ~/.bash_history; then
    echo "You appear to have typed 'foo' in the past"
fi

Bash – Backslash escapes

Különleges karakterek escape-elése:

! " # & ' ( ) , ; < > [ | \ ] ^ { } ` $ * ?

Bash – Heredoc

Többsoros szöveg beolvasása heredoc-kal:

cat <

Bash – Előző könyvtár

Könyvtárváltás vissza az előzőre:

pwd   # /home/user/foo
cd bar/
pwd   # /home/user/foo/bar
cd -
pwd   # /home/user/foo

Bash – Input olvasása

Felhasználói input beolvasása:

echo -n "