Bash scripting


Za otvoriti konzolu u VS Code cmd + j

Ekstenzija za shell script je .sh

Da fajlu napravimo executable da je možemo pokrenuti u konzolu pišemo chmod +x imeSkripte.sh

chmod +x myscipt.sh

da pokrenemo skriptu pišemo ./imeSkripte.sh

./myscipt.sh

Da vidimo gdje se nalazi bash u sistemu pišemo i to ujedno pišemo u prvoj liniji skripte #!/bin/bash

which bash

Obavezno pišemo u prvoj liniji.

#!/bin/bash

Za komentiranje u bash skriptama koristimo # znak

#inline comment

Za ispisivanje u konzolu koristimo echo komandu

#!/bin/bash

echo Hello World

Varijable se u pravilu pišu sa VELIKIM SLOVIMA može i s malim ali je norma da se pišu VELIKIM
Za korištenje varijable koristimo $ (dollar)

#!/bin/bash

NAME="John"
echo "My name is $NAME"

Može i ovako ali je rezultat isti

#!/bin/bash

NAME="John"
echo "My name is $NAME"
echo "My name is ${NAME}"

User input ako želimo da korisnik nešto upise da to ubacimo u varijablu i ispišemo u konzoli

#!/bin/bash

read -p "Enter your name: " NAME
echo "Hello $NAME"

if statment

NAME="John"

#SIMPLE IF STATMENST
if [ "$NAME" == "John" ]
then
  echo "Your name is John"
fi

if-else

NAME="John"

if [ "$NAME" == "Johhn" ]; then
  echo "Your name is John"
else
  echo "Your name is not John"
fi

else if (elif)

NAME="John"

if [ "$NAME" == "Jack" ]; then
  echo "Your name is Jack"
elif [ "$NAME" == "John" ]; then
  echo "Your name is John"
else
  echo "Your name is not John"
fi

Uspoređivanje

# val1 -eq val2 Returns true if the values are equal
# val1 -ne val2 Returns true if the values are not equal
# val1 -gt val2 Returns true if val1 is greater than val2
# val1 -ge val2 Returns true if val1 is greater than or equal to val2
# val1 -lt val2 Returns true if val1 is less than val2
# val1 -le val2 Returns true if val1 is less than or equal to val2
NUM1=3
NUM2=5
if [ "$NUM1" -gt "$NUM2" ]; then
  echo "$NUM1 is greather then $NUM2"
else
  echo "$NUM1 is less then $NUM2"
fi

Stanje file FILE CONDITIONS

# -d file   True if the file is a directory
# -e file   True if the file exists (note that this is not particularly portable, thus -f is generally used)
# -f file   True if the provided string is a file
# -g file   True if the group id is set on a file
# -r file   True if the file is readable
# -s file   True if the file has a non-zero size
# -u    True if the user id is set on a file
# -w    True if the file is writable
# -x    True if the file is an executable

U ovom slučaju smo uspoređivali dali je test.txt fajla u ovom slučaju je još nismo stvorili pa vraća
test.txt is not a file

FILE="test.txt"
if [ -f "$FILE" ]; then
  echo "$FILE is a file"
else
  echo "$FILE is not a file"
fi

ako je stvorimo

Ako stavimo provjeru dali postoji is exists sa -e onda ce davati da postoji nema veze što je to folder

FILE="test.txt"
if [ -e "$FILE" ]; then
  echo "$FILE is exists"
else
  echo "$FILE is NOT a exists"
fi

Case statement tražmo od korisnika da upise dali je stariji ili nije od 21
Sa case počima sintaksa a sa esac završava kontra od case

read -p "Are you 21 or over? Y/N " ANSWER
case "$ANSWER" in
[yY] | [yY][eE][sS])
  echo "You can have a beer :)"
  ;;
[nN] | [nN][oO])
  echo "Sorry, no drinking"
  ;;
*)
  echo "Please enter y/yes or n/no"
  ;;
esac

for loop

NAMES="Brad Kevin Alice Mark"
for NAME in $NAMES

Ovaj prvi NAME nema $ dollar znak jer tu definiramo varijablu a vučemo zapis iz $NAMES varijable.

NAMES="Brad Kevin Alice Mark"
for NAME in $NAME; do
  echo "Hello $NAME"
done

for loop za preimenovanje fajla .
Preimenovanje radimo sa mv comandom

U 1. liji smo izabrali sve fajle sa .txt ekstenzijom i stavili ih u varijablu FILES
U 2. liniji smo definirali varijablu NEW sa kojem zapisom da preimenujemo fajle.
U 3. smo provukli kroz for petlju.
U 4 liniji ispisujemo u konzoli rezultate
U 5 komandom mv smo rekli da preimenuje file tj. preuzme stari naziv i nadoda novi.

FILES=$(ls *.txt)
NEW="new"
for FILE in $FILES; do
  echo "Renaming $FILE to new-$FILE"
  mv $FILE $NEW-$FILE
done

while loop

U new-1.txt dodamo tekst
U 1. liniji postavimo varijablu LINE=1 da čita od prvog reda
U 2. liniji sa while loopom kreiramo varijablu CURRENT_LINE i dajemo joj naredu da ćita read
Opcija -r proslijeđena naredbi za čitanje sprječava tumačenje izlaza obrnute kose crte.
U 3. liniji ispisujemo u konzoli tekst.
U 4. liniji povećavamo LINE za 1
U 5 liniji stavljamo done za završetak loopa i nakon toga dodajemo fajlu koju ćemo ispisivati.

LINE=1
while read -r CURRENT_LINE; do
  echo "$LINE: $CURRENT_LINE"
  ((LINE++))
done <"./new-1.txt"

Primjer bez -r

LINE=1
while read CURRENT_LINE; do
  echo "$LINE: $CURRENT_LINE"
  ((LINE++))
done <"./new-1.txt"

Funkcije function
Funkcije u bashu su kao i u ostalim jezicima

function sayHello() {
  echo "Hello World"
}

sayHello

Funkcije sa parametrima
Dodajemo parametre sa $1 $2 i tako dalje a vrijednosti upisujemo kad pozivamo funkciju.

function greet() {
  echo "Hello, I am $1 and I am $2"
}

greet "Brad" "36"

Okidanje bash komandi ili nizanje komandi da odradi jednu za drugom, pravilo je da se samo pišu jedna ispod druge i oni će se okidati s tim redoslijedom.

Kreiranje foldera i tekst fajle u njemu
U 1. liniji smo kreirali folder hello
U 2. liniji smo kreirali tekstualnu fajlu
U 3. liniji smo dodali tekst u fajlu
U 4. liniji smo prikazali u konzoli

mkdir hello
touch "hello/world.txt"
echo "Hello World" >>"hello/world.txt"
echo "Created hello/world.txt"