Pomoc oko pravljenja skripti

4

Pomoc oko pravljenja skripti

offline
  • Pridružio: 20 Feb 2005
  • Poruke: 4505
  • Gde živiš: planeta Zemlja

Da, mora se navede da je flv (tj. avi) ulazni a mpg (tj. mp4) izlazni fajl!
Btw komanda za kovertovanje iz avi u mp4 je:


ffmpeg -i input.avi -acodec mp3 -vcodec mpeg4 -s 320×240 -r 27 output.mp4


Btw moze li me neko uputiti na komandu koja ce mi dopustiti da sam ukucam folder u kome zelim da se skripta izvrsi? Znaci da me pita u kom folderu ja zelim to da izvrsim (recimo to konvertovanje iz avi formata u mp4) tj da mi zatrazi da sam ukucam putanju Exclamation



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Pridružio: 01 Okt 2004
  • Poruke: 351
  • Gde živiš: Qrshumliya

Je l ti odgovara nesto tipa:

read dir
cd $dir


Ako hoces tako nesto, lepo bi bilo da usput proveris da li uneti direktorijum postoji, pa u slucaju nepostojanja obradis izuzetk (ponovni unos, prekid rada, sta vec hoces Wink)



offline
  • Pridružio: 20 Feb 2005
  • Poruke: 4505
  • Gde živiš: planeta Zemlja

Ne znam da li odgovara zato sto ne mogu sada to da probam. U principu svaka varijanta koja mi nudi mogucnost da sam ukucam putanju do foldera u kome se vrsi konverzija je prihvatljiva Wink

btw dobru si mi ideju dao:
ako nema zeljenog foldera on neka izbaci "Fatal error" Smile

Onu skriptu sa pocetka ove strane mogu da iskoristim za to (za pretragu foldera)?

offline
  • soxxx 
  • Prijatelj foruma
  • Pridružio: 25 Maj 2005
  • Poruke: 1482
  • Gde živiš: Gracanica, Kosovo

Iz druge skripte koju si naveo vec imas ono sto trazis, samo malo izmeni:
if [ -n "$1" ]
 then
   directory=$1      # If directory name given as a script argument...
 else
   directory=$PWD    # Otherwise use current working directory.
 fi


Sto se tice konverzije ja sam samo iskopirao ono sto si ti stavio, ne koristim ffmpeg. Jesi li probao onu skriptu sto sam postavio gore?

offline
  • Pridružio: 20 Feb 2005
  • Poruke: 4505
  • Gde živiš: planeta Zemlja

Kazem ti ne mogu jos da probam (crk´o hdd).
Ok sada ce mi trebati neko vreme da sve to malo uklopim. Btw nasao sam jos nesto:

echo -n "Enter file name : "
read file


TO je ono sto je anarki dao ali u skripti koja ima za cilj unosenje fajla a ne foldera u kojem ce da proveri da li ima read, write and execute dozvole (nasao sam je na:
http://bash.cyberciti.biz/academic/find_read_write_execute_permission.sh.php ). Ok javljam vam se kada iskombinujem nesto (drugim recima kada bude spremna za prvu probu Mr. Green).

Hvala na svoj ukazanoj pomoci Smile

offline
  • bocke  Male
  • Moderator foruma
  • Glavni moderator Linux foruma
  • Veliki Pingvin
  • Guru
  • Pridružio: 16 Dec 2005
  • Poruke: 12486
  • Gde živiš: Južni pol

Rado bih i ja uronio u skripting, ali trenutno nemam vremena za to. Evo par saveta.

Napravi obradu komandnih argumenata
dodaj opcije skripti
dodaj obradu opcija
kao sto rece anarki - malo provere ne bi skodilo. Svaku akciju treba testirati za uspeh il neuspeh, zatim u odgovarajucem slucaju ispisati gresku i izaci iz programa ili sl.
bash podrzava strukturno programiranje koristeci funkcije - mozes to iskoristiti u skriptovima
Dodaj ispis i objasnjenje skripte kada se pokrene bez argumenata


E, tek tada je to prava skripta. Wink

offline
  • Pridružio: 20 Feb 2005
  • Poruke: 4505
  • Gde živiš: planeta Zemlja

Dakle gledao sam sve sto je napisano i ovo mi se cini kao najjednostavnije:
#!/bin/bash
# avi2mp4.sh

suffix1=[Aa][Vv][Ii]
suffix2=mp4
v=*.$suffix1
o=basename "$v" .$suffix1
operacija=ffmpeg -i '$o.suffix1' -acodec mp3 -vcodec mpeg4 -s 320×240 -r 27 '$o.$suffix2'

echo -n "Folder sa avi fajlovima : "
read dir
cd $dir

if [ -n $dir ]
then
   echo "FATAL: folder ne postoji!"
else
   echo "Pocinjem konvertovanje..."
fi

$operacija


E sad ovo ne moze da omane samo je pitanje da li sam dobro formatirao zahteve kada su sufixi u pitanju (da li je trebala neka zagrada ili ´ ili nesto slicno (ne kapiram sta ovi znaci interpunkcije znace)).

offline
  • Pridružio: 01 Okt 2004
  • Poruke: 351
  • Gde živiš: Qrshumliya

Heh... Interesantan nacin razmisljanja.
Mislim da ti je logicnije da komandu `cd` stavis u if-blok. T.j. da radi `cd` samo ako direktorijum postoji.

Ili da ti u uslovu prekida rad, a iza if-then bloka radi sta treba. Nesto kao
 echo -n "Unesite direktorijum: "
read dir

if [ ! -d $dir ]
then
     echo "ERR: $dir nije direktorijum."
     exit
if

cd $dir
$operacija

offline
  • Pridružio: 20 Feb 2005
  • Poruke: 4505
  • Gde živiš: planeta Zemlja

Da, da bas sam o tome sinoc razmisljao! Ali da li ce tvoja (anarki) skripta da, ako ne ukucam ispravnu putanju do foldera, da mi da dozvoli da ponovo kucam putanju?
Drugim recima ako pogresim putanju da li ce me opet pitati da je ukucam?

Inace mene nesto drugo zanima: kada upotrebljavam ", kada ´ a kada ˙ (znake interpunkcije)? Ovo pitam zato sto ne znam da li su mi kod suffixa komande date dobro (da li mozda treba da pise suffix1=´[Aa][Vv][Ii]´ ili suffix1="[Aa][Vv][Ii]")?

p.s. Ala sam se zarazio... Sada cu da dodam i opciju da iz avi formata konvertuje u mpeg! xi, xi, xi...

offline
  • Pridružio: 01 Okt 2004
  • Poruke: 351
  • Gde živiš: Qrshumliya

Naravno nece. Za to ti treba ciklus. Evo ti ideja:
#!/bin/bash

echo -n "Unesite direktorijum [$HOME]: "
read dir

while [ ! -d "$dir" ]
do
   echo
   echo Unos $dir nije validan naziv za direktorijum.
   echo Molimo Vas da unesete naziv postojeceg direktorijuma
   echo -n "Unesite direktorijum [$HOME]: "
   read dir
done

#U ovoj tacki je u $dir SIGURNO naziv direktorijuma ;)
cd "$dir"

#...i sta treba da se odradi...


Ovo ce da vrti petlju sve dok ne ubacis tacan naziv direktorijuma. Naravno ctrl-c ubija skriptu Wink
Primeti samo da se prazan string tretira kao home direktorijum.

Sto se ti ce apostrofa (quotes) evo odprilike sta je ideja:
Kada zelis komandi da preneses parametar koji sadrzi specijalan znak shella (u nasm slucaju basha), taj znak ce da se interpretira na odrovarajuci nacin. Sta hocu da ti kazem? Evo na primeru:

Napravicu novi direktorijum. Obrati paznju na navodnike: direktorijum se zove novi dir sto znaci da njegovo ime sadrzi jedan od "specijalnih" karaktera basha - razmak. Taj karakter sluzi da razdvoji argumente komande.
[~/local/nesto]rile: mkdir "novi dir"
[~/local/nesto]rile: ls
novi dir


Sad cemo probati da promenimo aktivni direktorijum sa
[~/local/nesto]rile: cd novi dir
bash: cd: novi: No such file or directory

Sta se deslio? Bash prvo interpretira njegov specijalan znak - razmak i shvata unos novi dir kao dva arhumenta, te ih tako prosledjuje komandi `cd`. Sada `cd` uzima prvi argument koji nije njen svic i tretira ga kao direktorijum, pa konstantuje da direktorijum novi ne postoji.

Da bi problem prevazisli mozemo da "kvotiramo" ili da upotrebimo "escape karakter" (u bashu je to back-slash).

[~/local/nesto]rile: cd "novi dir"
[~/local/nesto/novi dir]rile: cd ..
[~/local/nesto]rile: cd 'novi dir'
[~/local/nesto/novi dir]rile: cd ..
[~/local/nesto]rile: cd novi\ dir
[~/local/nesto/novi dir]rile: cd ..
[~/local/nesto]rile:   

Radi, naravno.

Sad, da malo zakomplikujemo zivot. Usecemo promenljivu. Neka se zove $mydir. Evo koda za inicijalizaciju:

[~/local/nesto]rile: mydir="novi dir"
[~/local/nesto]rile: echo $mydir
novi dir
[~/local/nesto]rile: 

Oket, naziv naseg direktorijuma smo strpali u ovu promenljivu.
Hajde da koristeci nju udjemo u direktorijum:

[~/local/nesto]rile: cd $mydir
bash: cd: novi: No such file or directory
[~/local/nesto]rile:

Nece!
Sta mu je sad? Pa isto ono od malopre: Bash svoju promenljivu $mydir razvija i dobije komandu `cd novi dir` i opet se vraca na onu situaciju od malo pre.

Ajdemo drugacije:
[~/local/nesto]rile: cd "$mydir"
[~/local/nesto/novi dir]rile: cd ..
[~/local/nesto]rile:

Evo ga!
Sta se sad deslio? Pa, bash je opet razvio svoju promenljivu, ali je ostavio navode oko njih i dobio komandu `cd "novi dir"` i izvrsioo je kao da je to direktno ukucano!

Sta je sa apostrofom? Probamo:
[~/local/nesto]rile: cd '$mydir'
bash: cd: $mydir: No such file or directory
[~/local/nesto]rile:   

Sta mu je sad? Prosto: Unutar apostrofa bash ne razvija promenljive. Znaci da je ovo prokomentarisao kao da treba da "udje" u direktorijum koji se zove $mydir doslovno.

Pazi: medju apostrofima i navodima se ne razvijaju wildchar (npr. *) znaci.
Ima jos dosta o ponasanju navoda da se prica. Procunjaj po netu ako te zanima Wink

Sto se tice back-qutea, to je "komanda u komandi". Znaci sve sto je oiviceno sa ` se tretira kao komanda. Izlaz te komande menja orginalni tekst izmedju obrnutih apostrofa. Nadam se da kapiras sta ti kazem Smile
Evo da napravimo primer:
Napravicu jedan fajl u istom direktorijumu:
[~/local/nesto]rile: touch 'echo MyCity'
[~/local/nesto]rile: ls
echo MyCity  novi dir


Sad da vidimo sta kaze komanda `ls`:
[~/local/nesto]rile: ls
echo MyCity  novi dir
[~/local/nesto]rile:     


Sad cemo je pozvati sa back-quote:
[~/local/nesto]rile: `ls`
MyCity novi dir
[~/local/nesto]rile:   

Nesto fali? Ustvari, ne.
Evo sta se desilo: Prvo se izvrsila komanda izmedju ovih naopackih apostrofa, dakle ls. Rezultat te komande je red echo MyCity novi dir. Sada citav taj red stavli na mesto komande `ls`, odnosno kao da smo ukucalil direktno echo MyCity novi dir. To se izvrsi i dobijemo ono sto smo dobili Wink

Ovo ti je banalan primer, ali da skontas o cemu se radi. Ova stvar je veoma mocna, inace.

Ko je trenutno na forumu
 

Ukupno su 1262 korisnika na forumu :: 40 registrovanih, 6 sakrivenih i 1216 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: _Rade, A.R.Chafee.Jr., Asparagus, Bobrock1, Bokiboks, Boris90, Cassius Clay, CikaKURE, crnogorac, Dimitrise93, Dorcolac, FOX, GandorCC, Georgius, HrcAk47, ikan, ILGromovnik, Kruger, laurusri, lord sir giga, Luka Blažević, marsovac 2, Metanoja, milenko crazy north, Milos82, Pikac-47, Rakenica, raptorsi, repac, RJ, saputnik plavetnila, shone34, Smajser, stegonosa, taz1cl, theNedjeljko, vathra, VJ, vukovi, Zoca