Egyszerű script, amely kiírja a „Hello world!” üzenetet:
#!/bin/bash
VAR="world"
echo "Hello $VAR!" # => Hello world!
# futtatás:
bash hello.sh
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)
Egysoros és többsoros kommentek:
# Ez egy egysoros komment
: '
Ez egy
többsoros komment
bash-ben
'
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
Egyszerű függvény létrehozása és meghívása:
get_name() {
echo "John"
}
echo "You are $(get_name)"
Egyszerű feltételes szerkezet:
if [[ -z "$string" ]]; then
echo "String is empty"
elif [[ -n "$string" ]]; then
echo "String is not empty"
fi
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
Parancs futtatása és eredményének behelyettesítése:
echo "I'm in $(pwd)"
# vagy
echo "I'm in `pwd`"
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
Változó részleteinek kiemelése:
${FOO:0:3} # substring (pozíció, hossz)
${FOO:(-3):3} # substring jobbról
Változó hosszának lekérése:
${#FOO} # $FOO hossza
É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
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
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
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/
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
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
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
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
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
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
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"
É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
Bejárás értékekkel és kulcsokkal:
for val in "${sounds[@]}"; do
echo $val
done
for key in "${!sounds[@]}"; do
echo $key
done
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ő
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
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
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
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
Egyszerű for ciklus fájlok bejárására:
for i in /etc/rc.*; do
echo $i
done
Számlálóval vezérelt for ciklus:
for ((i = 0 ; i < 100 ; i++)); do
echo $i
done
Számok bejárása tartományban:
for i in {1..5}; do
echo "Welcome $i"
done
Tartomány bejárása adott lépésközzel:
for i in {5..50..5}; do
echo "Welcome $i"
done
While ciklus számláló növelésével:
i=1
while [[ $i -lt 4 ]]; do
echo "Number: $i"
((i++))
done
While ciklus számláló csökkentésével:
i=3
while [[ $i -gt 0 ]]; do
echo "Number: $i"
((i--))
done
Elemek kihagyása ciklusban:
for number in $(seq 1 3); do
if [[ $number == 2 ]]; then
continue
fi
echo "$number"
done
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
Ciklus futtatása amíg a feltétel hamis:
count=0
until [ $count -gt 10 ]; do
echo "$count"
((count++))
done
Végtelen while ciklus:
while true; do
# kód
done
# rövidített forma
while :; do
# kód
done
Fájl sorainak bejárása:
cat file.txt | while read line; do
echo $line
done
Függvény létrehozása kétféle szintaxissal:
myfunc() {
echo "hello $1"
}
# alternatív szintaxis
function myfunc() {
echo "hello $1"
}
myfunc "John"
Függvényből érték visszaadása:
myfunc() {
local myresult='some value'
echo $myresult
}
result="$(myfunc)"
Függvény hibát jelez return kóddal:
myfunc() {
return 1
}
if myfunc; then
echo "success"
else
echo "failure"
fi
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
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
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
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
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
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
Egyszerű aritmetikai műveletek:
$((a + 200)) # hozzáad 200-at $a-hoz
$(($RANDOM%200)) # véletlen szám 0..199
Parancs futtatása külön subshellben:
(cd somedir; echo "I'm now in $PWD")
pwd # továbbra is az eredeti könyvtárban
Parancs típusának ellenőrzése:
command -V cd
# => "cd is a function/alias/whatever"
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
Script könyvtárának meghatározása:
source "${0%/*}/../share/foo.sh"
DIR="${0%/*}"
Elágazás case szerkezettel:
case "$1" in
start | up)
vagrant up
;;
*)
echo "Usage: $0 {start|stop|ssh}"
;;
esac
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
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
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
Parancs sikerességének vizsgálata:
if ping -c 1 google.com; then
echo "It appears you have a working internet connection"
fi
Hasznos shell változók:
$? # utolsó task exit státusza
$! # utolsó háttérfolyamat PID-je
$$ # shell PID
$0 # script fájlneve
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
Különleges karakterek escape-elése:
! " # & ' ( ) , ; < > [ | \ ] ^ { } ` $ * ?
Többsoros szöveg beolvasása heredoc-kal:
cat <
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
Felhasználói input beolvasása:
echo -n "