Bash смернице

Prizma

Active member
Joined
Feb 13, 2017
Messages
461
Reaction score
76
Да ли неко може да ми препоручи добар сајт, или књигу на тему bash скриптовања?
Већина ствари на које наилазим не дају објашњења за неке компликованије ствари. Типа ако желим функцију која узима више параметара, па је у њој нека петља или нешто:

function funkcija($arg1, $arg2, $arg3) { while [[ $arg1!=$arg2 && $arg1!=$arg2]]; do echo "trt-mrt" read $arg1 funkcija($arg1, $arg2, $arg3) done if [[ $arg1==$arg2 ]] then echo "trt-mrt-opet" fi else if [[ $arg1==$arg3 ]] then echo "nesto trece" fi else echo "nemam vise inspiracije" }

Куцкам псеудо код, наравно, јер немам појма како иде синтакса. Ова ф-ја горе, конкретно треба да узме одговор корисника (yes/no, односно y/n) као стринг, па ако је y или n нешто да изврши спрам одговора, а ако се не поклапа ни са једним од та два, да прикаже грешку и препоручи јевтин дактилографски курс.

Много је различитих упутстава тамо на интернету, а нека се чак и разликују по питању основних ствари. Типа:
if [[ $arg1==$arg2 ]] then
а може и:
if (( $arg1==$arg2 )) then
Такође, да ли иде тачка-зарез након “if” услова. Мада, негде сам прочитао да тачка зарез отвара под-процес у ком се та петља извршава. Слично оном пајповању (цевовању, негујмо српски језик) где постоје 3 варијанте (&, |, ; ). Сад, сувише сам то лабаво прешао, да бих се сетио свих детаља…

Па оно… препоручите 🙂
 
Last edited:

merin

Member
Joined
Mar 11, 2017
Messages
177
Reaction score
3
Probaj ovde da nađeš:
 
Last edited:

Lazar

Member
Joined
Sep 1, 2013
Messages
550
Reaction score
21
Симбол ; користиш као замену за размак. Пример:

if [[$PROMENLJIVA == 1234]] then echo "True" else echo "False" fi
if [[$PROMENLJIVA == 1234]] ; then echo "True" ; else echo "False" ; fi
Што се тиче литературе, препоручујем:
EnglishFrontPage - Greg’s Wiki
Welcome to The Grymoire! - sh, sed, grep, awk …
 
Last edited:

Misko_2083

Member
Joined
Mar 15, 2015
Messages
306
Reaction score
18
http://tldp.org/LDP/Bash-Beginners-Guide/html/

Ovako bi ta funkcija izgledaja
Code:
#!/bin/bash

function merac_pritiska(){
# Ovde se čita unos i smešta ga u promenljivu "odgovor"
read -r -p "Da li ste sigurni da hoćete merač pritiska? [D/n] " odgovor

# Provera sadržaja promenljive "odgovor"
# regularni izraz ^([dD])+$
if [[ "$odgovor" =~ ^([dD])+$ ]]; then
   echo "Kupujete. PRIZMA iz Kragujevca misli na vas."
elif [[ "$odgovor" =~ ^([nN])+$ ]]; then
   echo "Odustao, možda drugi put."
   exit 1
else
    echo "Greška u unosu"
    exit 1
fi
}

# Pozivanje funkcije "merac_pritiska"
merac_pritiska

Ako hoćeš da ograniš odgovor na [d/n], možeš da koristiš beskonačnu petlju iz koje se izlazi samo ako je odgovor d, D, n ili N.

Code:
#!/bin/bash

function upitnik(){
  while true; do
    read -r -p "Da li ste sigurni da hoćete patike? [D/n] " REPLY
    case $REPLY in
      [dD])  return 0 ;;
      [nN])  return 1 ;;
      *) echo "Samo [D/n] su mogući odgovori!"
    esac
  done
}

upitnik
# smeštamo exit status "$?" funkcije "upitnik" u promenljivu odgovor
odgovor="$?"

if [[ $odgovor -eq 0 ]]; then
   echo "Kupujem."
elif [[ $odgovor -eq 1 ]]; then
   echo "Odustao, možda drugi put."
   exit
fi

echo "Kupio patike"
If [[ uslov ]]; then može da se napiše i ovako

If [[ uslov ]] then
tačka-zarez označava gde počinje novi red t.j. nova komanda

if [[ uslov ]] then echo 1; echo 2; echo 3 fi

if proverava da li je “exit status” nula.

Uzmimo na primer komandu “true” čiji je izlaz uvek 0. Otvori terminal i unesi
true; echo "$?"
Dok false uvek ima 1.
false; echo "$?"
Sledeći red će odštampati ok na ekranu
if true; then echo ok; fi
Ovaj red neće.
if false; then echo ok; fi
 
Last edited:

Prizma

Active member
Joined
Feb 13, 2017
Messages
461
Reaction score
76
Ako hoćeš da ograniš odgovor na [d/n], možeš da koristiš beskonačnu petlju iz koje se izlazi samo ako je odgovor d, D, n ili N
Да, то сам и урадио (теоријски), са while петљом у функцији, која позива саму функцију док се један од два услова не испуне.

Што се тиче function upitnik() {…}, ту нешто дебело нисам разумео, а није везано само за bash. Пошто је цела ф-ја под while true, одговор који враћа 0 би требало поново да покрене петљу, што значи да ће се вртети бесконачно ако је одговор “да”, што нема смисла…

*) --ово је default, и ваљда враћа false(?)

Молим и објашњење за [dD]) и [nN]) o_O. Да ли прихвата унос који се поклапа са једним, било којим карактером који се налази под []), или ће да прихвати и унос ‘Dd’ или ‘dD’ или само ‘D’ или само ‘d’?
# regularni izraz ^([dD])+$
Верујем да ће одговор на претходно питање одговорити и за овај хијероглиф, односно то сад само служи за даље поређење.

Везано за exit 1. Ово сам нашао на нету:
Exit code 0 Success
Exit code 1 General errors,Miscellaneous errors, such as “divide by zero” and other impermissible operations
Exit code 2 Misuse of shell builtins (according to Bash documentation) Example: empty_function(){}

Овај случај разумем зашто иде exit 1:
Code:
else
    echo "Greška u unosu"
    exit 1
fi
Али зашто и овде exit 1, кад нема грешке? Само треба да да поруку за један од два валидна избора и настави својим путем…
Code:
elif [[ "$odgovor" =~ ^([nN])+$ ]]; then
   echo "Odustao, možda drugi put."
   exit 1
 
Last edited:

Lazar

Member
Joined
Sep 1, 2013
Messages
550
Reaction score
21
Скрипта прво позове функцију, а из функције се врађа назад када се дође до return наредбе. То значи да ће се извршавање функције прекинути онда када корисник унесе неки од симбола D, d, N, n. Када унесеш n, функција вради статус 0 и то се упише у променљиву одговор.

Што се тиче регуларних израза, они су наука за себе. Овај пример конкретно проверава да ли се на првом месту у промељивој налази d ili D (ако сам добро видео). Саветујем да озбиљно изучиш регуларне изразе, примењују се стално када се ради некаква обрада текста.
 
Last edited:

Prizma

Active member
Joined
Feb 13, 2017
Messages
461
Reaction score
76
Скрипта прво позове функцију…
Јесте. Побрљавио сам мало у глави. Све јасно на ту тему.
Саветујем да озбиљно изучиш регуларне изразе
Мхм. Осим што употреба знакова уме да варира колико ја знам. Ал ајде, логика је иста.
 
Last edited:

Prizma

Active member
Joined
Feb 13, 2017
Messages
461
Reaction score
76
Може ли се помоћу C језика направити програм који покреће неку .sh скрипту? Покушавам да направим нешто што наликује .exe фајлу у Винџи. Мрзи ме да отварам терминал и куцкам ./nesto.sh и chmod + x ( јел у GUI-у chmod оно кад ме пита “mark executable”? )
 
Last edited:

Dragan

Well-known member
Staff member
Joined
Jan 13, 2012
Messages
6,371
Reaction score
65
alt
Prizma:
јел у GUI-у chmod оно кад ме пита “mark executable”?
Da
 
Last edited:

Dragan

Well-known member
Staff member
Joined
Jan 13, 2012
Messages
6,371
Reaction score
65
alt
Prizma:
Мрзи ме да отварам терминал
Skriptu koja pokreće drugu skriptu možeš da startuješ i bez otvaranja terminala, a kroz alias možeš da postaviš sve što ti padne na pamet.
Npr, često koristim jedan glupavi alias malo kriptičnog naziva, ali meni vrši posao u terminalu:

alias tchmia='dch -c debian/changelog --force-distribution -D mia --no-auto-nmu'
 
Last edited:

Prizma

Active member
Joined
Feb 13, 2017
Messages
461
Reaction score
76
Да, али… Ову сам специјално наменио да ради одмах након инсталације и да копира неке теме за xfce и прави неопходне фолдере за све кориснике, мрзи ме да се бакћем с тим стварима. Алијас бих морао да додајем након инсталације. Мислио сам да функционише више као готов програмчић…
Еdit:
Сад ћу да видим шта каже, поткрале су ми се неке грешке у самој скрипти
 
Last edited:

Dragan

Well-known member
Staff member
Joined
Jan 13, 2012
Messages
6,371
Reaction score
65
alt
Prizma:
Ову сам специјално наменио да ради одмах након инсталације и да копира неке теме за xfce и прави неопходне фолдере за све кориснике, мрзи ме да се бакћем с тим стварима. Алијас бих морао да додајем након инсталације. Мислио сам да функционише више као готов програмчић…
Hm? zar nije bolje onda da napraviš rpm paket za to što tebi treba, ako već koristiš Suse?
Kroz SPEC file za rpm build možeš sve da definišeš…
 
Last edited:

Prizma

Active member
Joined
Feb 13, 2017
Messages
461
Reaction score
76
Можда? Нисам дошао до тог нивоа још :D.
Покушавам да видим шта ми багује у овој скрипти
 
Last edited:

Prizma

Active member
Joined
Feb 13, 2017
Messages
461
Reaction score
76
Ма не кажем… Што да не 🙂 само идем једно по једно. Ако није фрка, треба ми мала помоћ око саме скрипте. Дакле треба да направи .themes директоријум у сваком home фолдеру, ма колико их има и како се звали, а потом прекопира фајлове које је претходно отпаковала и убаци све отпаковане фолдере у сваки .themes у сваком home диру ( леле ал га срочих ). За сада, скрипта прави .themes фолдере успешно тамо где треба, ал никако да прекопира отпакован садржај…
Одмах да напоменем, ово што пише “home/phq/Programming/fakeRoot/home/”, то је путања за тест полигон. Дакле fakeRoot је ту да замени прави root да не правим брљотине по систему… Сама скрипта би требало да је проста:
Code:
#! /bin/bash

## 13-08-2018
## Copy themes to all users

a=""
## otpakuje fajl i pamti gde je otpakovan
current_dir=$(pwd)
tar -xvzf nu_XFCE_pack.tar.gz
for dir in /home/phq/Programming/fakeRoot/home/*/; do
    cd $dir; mkdir .themes
## Ovaj deo (mislim) ne radi kako treba
    a=$("$dir"/.themes)
    cp -R $current_dir/"nu Xfce pack"/*/ $a/
done
Вероватно сам зезнуо неки симбол негде, још ми је нова ова синтакса.
 
Last edited:

Dragan

Well-known member
Staff member
Joined
Jan 13, 2012
Messages
6,371
Reaction score
65
Malo sam izmenio metodologiju, izbacio sam promenljivu “a”…skripta ulazi u user dir, pravi .themes folder, ulazi u taj folder, prekopira sadržaj, vraća se u ~/home, i tako redom, for petlja.
Naravno, i putanju sam promenio za testiranje kod mene, pa je ti vrati kako tebi odgovara…u principu je nevažno.
Sintaksu uporedi sa tvojom, par sitnica razlike ima, a i ja volim da telo petlje uredim pregledno…u velikim zagradama.

Code:
#! /bin/bash
[HEADING=1]13-08-2018[/HEADING]
[HEADING=1]Copy themes to all users[/HEADING]
a=“”
[HEADING=1]otpakuje fajl i pamti gde je otpakovan[/HEADING]
current_dir=$PWD
tar -xvzf nu_XFCE_pack.tar.gz
for dir in /home/dragan/Desktop/fakeRoot/home/*/; do
{
cd $dir
mkdir .themes
cd .themes
cp -R $current_dir/“nu XFCE pack”/ .
cd …
}
done

View attachment 5258
 
Last edited:

Prizma

Active member
Joined
Feb 13, 2017
Messages
461
Reaction score
76
alt
Dragan:
ja volim da telo petlje uredim pregledno…u velikim zagradama
Волим и ја, ал на тему нигде нисам наишао да се заправо употребљава у bash-у.

Ок, бар сам био на добром путу. Једино не видим сврху cd… команде пред крај, кад ће ионако да врати у други директоријум у следећем обрту. Ископирано је. Само сам мало променио у:
cp -R $current_dir/"nu XFCE pack"/*/ .
ал то је то. За current_dir=$PWD нисам знао да може. Увек варијаблама којима додељујем излазну вредност неке команде стављам као var=$(some_command), но то су сад ситнице. Хвала 🙂
 
Last edited:

Dragan

Well-known member
Staff member
Joined
Jan 13, 2012
Messages
6,371
Reaction score
65
@Prizma
Moje “znanje” o skriptama je prilično jadnjikavo, na početničkom nivou.
Ipak, razumem osnovne principe, pa su mi zgodne da rešim konkretan problem 🙂
Ovo je primer kako je kroz skiptu “rešena” instalacija rEFInd u TRIOS-u, kada dotični treba da se instalira na UEFI…prosto ga prekopiram iz live iso, mrzelo me da pravim custom deb 🙂
Skripta je ubačena u instaler, i radi ono čemu je namenjena 🙂

Code:
#!/bin/bash
[HEADING=1]Copyright © 2015 TRIOS project http://trios.rs[/HEADING]
[HEADING=1]Dragan Kramar [email protected][/HEADING]
[HEADING=1]This script is licensed under GNU GPL version 2.0 or above[/HEADING]
[HEADING=1]-------------------------------------------------------------------------[/HEADING]
set e
[HEADING=1]sve što je potrebno za instalaciju refind već imamo u triosefi.img[/HEADING]
[HEADING=1]dakle, prikopčamo triosefi.img pod /mnt, prekopiramo gde šta treba u target[/HEADING]
mount -t auto -o loop /triosefi.img /mnt
cd /mnt
cp -r keys /boot/efi/
cd EFI
cp -r boot tools /boot/efi/EFI
[HEADING=1]izađemo iz /mnt i otkačimo ga[/HEADING]
cd / && umount /mnt
[HEADING=1]zatim instaliramo efibootmgr i registrujemo refind u NVRAM[/HEADING]
[HEADING=1]instalacija efibootmgr, za slučaj da nema mreže, može da se odradi i kroz support folder u iso[/HEADING]
[HEADING=1]zajedno sa grub-efi paketima ?[/HEADING]
apt update && apt install -y efibootmgr
efibootmgr -c -l \EFI\boot\grubx64.efi -L rEFInd

exit 0
 
Last edited:
Top