Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Programování v BASH

Dobrý den, narazil jsem na vaši poradnu a myslel jsem si, že by mi odsud mohl někdo pomoct. Konkrétně bych potřeboval pomoct s programováním skriptu v BASH, ale vidim to uplně poprvě a nevim o tom skoro nic, jen něco z přednášek a co jsem se dočetl, ale nevim jak pořádně psát příkazy atd... Mohl byste mě někdo trochu pomoc se zadáním mého úkolu?

Znění úkolu:
Cílem úlohy je vytvořit skript (tzv. wrapper), který bude spouštět textový editor. Skript si bude pamatovat, které soubory byly v jakém adresáři prostřednictvím daného skriptu editovány. Pokud bude skript spuštěn bez parametrů, vybere skript soubor, který má být editován.

Specifikace chování skriptu

JMÉNO

wedi - wrapper textového editoru s možností automatického výběru souboru

POUŽITÍ

wedi [ADRESÁŘ]
wedi -m [ADRESÁŘ]
wedi SOUBOR
wedi -l [ADRESÁŘ]
wedi -b|-a DATUM [ADRESÁŘ]

POPIS

Pokud byl skriptu zadán soubor, bude editován.
Pokud není argumentem skriptu zadáno jméno editovaného souboru, skript z daného adresáře vybere soubor pro editaci. Výběr je následující:
Pokud bylo v daném adresáři editováno skriptem více souborů, vybere se soubor, který byl pomocí skriptu editován jako poslední. Editací souboru se myslí třeba i prohlížení jeho obsahu pomocí skriptu (tj. není nutné, aby byl soubor změněn).
Pokud byl zadán argument -m, vybere se soubor, který byl pomocí skriptu editován nejčastěji.
Pokud nebyl v daném adresáři editován ještě žádný soubor, jedná se o chybu.
Pokud nebyl zadán adresář, předpokládá se aktuální adresář.
Skript dokáže také zobrazit seznam všech souborů (argument -l), které byly v daném adresáři editovány.
Pokud byl zadán argument -b resp. -a (before, after), skript zobrazí seznam souborů, které byly editovány před resp. po zadaném datu. DATUM je formátu YYYY-MM-DD. Jsou zobrazeny soubory, které byly skriptem editovány od daného data včetně.Budu vám moc vděčný když mě někdo s tím trochu pomůže. Děkuju mockrát.

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Ahoj. Jako student FITu bys měl projevit trochu samostatnosti. K Bashi jde toho najít na netu opravd…
Niko Bellic 13.03.2015 21:40
Niko Bellic
Já mám problém s tím, že si to nedokážu dekomponovat a rozložit si to na jednoduché problémy, já na…
snowman666 13.03.2015 21:46
snowman666
Co začít tím nejjednodušším? Vytvořit si skript, který napíše hello. Potom tam máš řešit parametry.…
Niko Bellic 13.03.2015 22:04
Niko Bellic
no tak já znám ty jednotlivý příkazy jako echo, ls,cat, atd... ale neumim to poskládat dokupy. Já by…
snowman666 13.03.2015 22:07
snowman666
obávám se, že jsi zvolil špatný studijní obor. Analýza a dekompozice problému je totiž základ. nový
touchwood 14.03.2015 20:30
touchwood
já porad doufám ze se to nějak naucim a nepochybuju o tom ale potřebují vědět jak na to nový
snowman666 14.03.2015 23:42
snowman666
třeba ne, vypadá to jako můj problém. pokud mi ráno vysvětlíš princip, večer programuju.:)) nový
kmochna 15.03.2015 04:59
kmochna
k tomu výběru parametrů budu potřebovat nejspíš getopts, ale nevim jak to použít.
snowman666 13.03.2015 22:09
snowman666
To si přece můžeš najít ne? http://wiki.bash-hackers.org/howto/getopts_tutoria l Jsou tam příklady p…
Niko Bellic 13.03.2015 22:15
Niko Bellic
tak kdybych teda chtěl začít asi tím nejjednodušším tak je, že ten skript otevře soubor a bude ho ed…
snowman666 13.03.2015 22:21
snowman666
http://wiki.bash-hackers.org/commands/builtin/exec Název souboru bude v některém parametru. Jak ho… nový
Niko Bellic 13.03.2015 22:28
Niko Bellic
no tak jsem napsal pár prvních řádků ale nefunguje to tak jak jsem si představoval, když dám nějakej… nový
snowman666 13.03.2015 23:10
snowman666
můžete mi někdo pomoct sv tím? nový
snowman666 14.03.2015 08:33
snowman666
Vobec nepotrebujes getopts. Vstupne argumenty su pod premennymi $1 - $n. Cele pole argumentov je pod… nový
wam_Spider007 14.03.2015 08:53
wam_Spider007
já uplně nechápu jak udělat tu editaci program, když zadám např. ./wedi.sh [adresář] nebo soubor aby… nový
snowman666 14.03.2015 09:16
snowman666
tvoj script je len wrapper (obalka) nejakeho ineho textoveho editora. adresar needitujes. ked script… nový
wam_Spider007 14.03.2015 09:31
wam_Spider007
oukej to mě funguje, ale teď potřebuju aby mě to fungovalo na kterej koliv soubor co tam zadám nový
snowman666 14.03.2015 09:46
snowman666
Napriklad takto. V prvom kroku overis, ci do scriptu bol zadany prave jeden parameter. V tvojom prip… nový
wam_Spider007 14.03.2015 09:52
wam_Spider007
ale jak to zjistí odkud ten soubor má otevřít? nový
snowman666 14.03.2015 09:55
snowman666
no musis mu poslat celu cestu. v tvojom pripade (vo wrapperi, ktory mas urobit), bude pride do scrip… nový
wam_Spider007 14.03.2015 09:59
wam_Spider007
#!/bin/bash EDITOR=vim SOUBOR=$PATH if [ $# -ne 1 ];then echo "Script vyžaduje argument" fi if [ -f… nový
snowman666 14.03.2015 10:04
snowman666
#!/bin/bash EDITOR=vim SOUBOR=$1 if [ $# -ne 1 ];then echo "Script vyžaduje argument" fi if [ -f $SO… nový
wam_Spider007 14.03.2015 10:12
wam_Spider007
jj mockrát dík už jsem na to přišel :), teď to umí otevřít soubor když ho zadám, popř. adresář když… nový
snowman666 14.03.2015 10:36
snowman666
A mám problém s pochopením těchto dvou bodů: Skript si pamatuje informace o svém spouštění v soubor… nový
snowman666 14.03.2015 10:58
snowman666
Máš si ukládat a načítat vlastní soubor s nastavením. Formát si určíš sám, je jedno jaký, ale musíš… nový
Niko Bellic 14.03.2015 16:51
Niko Bellic
kdybych se pták tam tak se ne zeptaj co na ty škole vůbec dělám, mám vytvořeny soubor txt do který h… nový
snowman666 14.03.2015 19:57
snowman666
Na věci ohledně zadání, pokud nečemu nerozumíš se tam můžeš ptát neomezeně.. :-) Tak v tom souboru b… nový
Niko Bellic 14.03.2015 20:18
Niko Bellic
Neslo by to prosim te trochu a konkrétněji ja nevím jak do toho svého skriptu zakomponovat to ukládá… nový
snowman666 15.03.2015 03:56
snowman666
Lina huba, holy nestesti. Od ceho jsou asi konzultace? nový
ucitel 24.03.2015 11:19
ucitel
bingo. :-) Ono není problém poradit a nasměrovat i tady, ale řešit to za někoho určitě nebudeme. nový
touchwood 25.03.2015 19:13
touchwood
no to celkom nechapem ani ja. moze ist totiz o premennu prostredia (vygoogli si enviroment variables… nový
wam_Spider007 16.03.2015 09:21
wam_Spider007
samozřejmě že se jedná o proměnnou prostředí. Podstatou je ověřit její existenci a případně vygenero… nový
touchwood 25.03.2015 19:12
touchwood
ja sice nie som bash zaciatocnik, ale hodina by mi bola asi malo. predsalen ti zabere cas aj nejake… nový
wam_Spider007 25.03.2015 21:02
wam_Spider007
prosím vás pomožte mi, já už začínám bejt dost zoufalej :/ nový
snowman666 14.03.2015 16:05
snowman666
ses v haji, rovnou to vzdej :D nový
koncis 25.03.2015 17:57
koncis
ahoj, ja tu ulohu tiez robim, musime to odovzdat do polnoci, ako ti to ide? poslední
ssskdlsjkd 29.03.2015 19:51
ssskdlsjkd
To, co si dostal za ulohu spravit robi v Linuxe MidnightCommander (jeho interny editor), dokoca este… nový
Java250 14.03.2015 09:35
Java250

Ahoj. Jako student FITu bys měl projevit trochu samostatnosti. K Bashi jde toho najít na netu opravdu spousta. Když jsem dělal projekt do IOSu já, tak jsem začínal od nejjednodušších věcí - musíš si problém dekomponovat a hledat řešení primitivních akcí, např. jak zjistit obsah adresáře, jak spouštět programy, kam přesměrovat výstup atd. Pokud si nebudeš vědět rady s konkrétní věcí, tak se klidně zeptej, ale předhodit celé zadání a čekat že tě někdo povede je trochu naivní.. :-)

Co začít tím nejjednodušším? Vytvořit si skript, který napíše hello. Potom tam máš řešit parametry. Takže budeš hledat, jak bash zpracovává parametry a třeba si to hned vyzkoušíš, aby ti skript vypsal všechny parametry, které zadáš. Pak můžou přijít na řadu ty adresáře atd. Nemusíš hned tvořit skript podle zadání. Můžeš si dělat jednoduché skripty, které dělají nějakou primitivní věc. Na tom si vyzkoušíš, jak se to dělá. A poskládat z nich finální skript už nebude problém. :-)

tak kdybych teda chtěl začít asi tím nejjednodušším tak je, že ten skript otevře soubor a bude ho editovat. Nevím, ale jak napsat, aby to bralo ten nějakej soubor z argumentu k editaci tzn. vim že ho musim otevřít pomocí exec "editor" ale nevim do jaký proměnnýho dát atd.

no tak jsem napsal pár prvních řádků ale nefunguje to tak jak jsem si představoval, když dám nějakej přepínač a za něj něco tak mě to vždycky vypíše AHOJ.

while getopts ":m:l:b:a:" opt;
do
    case $opt in
            m)  marg=true
                mparametr=$OPTARG;;
            l)  larg=true
                lparametr=$OPTARG;;
            b)  barg=true
                bparametr=$OPTARG;;
            a)  aarg=true
                aparametr=$OPTARG;;
            :)
                echo
                "Možnost $OPTARG potřebuje argument." >&2
                exit 1;;
            \?)
                echo "Neplatná možnost: $OPTARG."
                exit 1;

            esac
done

((OPTIND--))

shift $OPTIND

if $marg; then
    echo "AHOJ"
else "cus"
fi

Vobec nepotrebujes getopts.
Vstupne argumenty su pod premennymi $1 - $n. Cele pole argumentov je pod premennou $@.
Staci si to pekne ohandlovat na zaciatku scriptu.
V podstate je uloha uplne primitivna. Jedina zlozita vec je pamatanie si metadat o otvorenych/editovanych suboroch. To sa da vyriesit tak, ze si to budes zapisovat do nejakeho svojho skryteho suboru.
Na konci script vzdy otvori vybrany subor pokocou editora vi alebo vim.

tvoj script je len wrapper (obalka) nejakeho ineho textoveho editora. adresar needitujes. ked scriptu zadas adresar, ma nejakou logikou vybrat vhodny subor v danom adresari a ten posunut do textoveho editora.
textovy editor je napriklad vim.
cize ked uz budes mat v nejakej premennej vhodny subor na editaciu, tak ho programu vim len posunies.
skus si v bashi spravit nieco taketo a pochopis:

#!/bin/bash
$subor="nejaky_subor.txt"
vim $subor

samozrejme ten nejaky_subor.txt musi existovat, inak sa ti otvori prazdny vim.

Napriklad takto. V prvom kroku overis, ci do scriptu bol zadany prave jeden parameter. V tvojom pripade pri wrapperi bude tych validacii trochu viac, kedze mozes mat rozne kombinacie vstupnych parametrov.
Nasledne sa overi, ze subor existuje. Ak ano, tak sa otvori v editore vim.

#!/bin/bash

if [ $# -ne 1 ]
  then
    echo "Script vyzaduje jeden argument"
fi

if [ -f $1 ]; then
    vim $1
else
    echo "Subor neexistuje"

fi

no musis mu poslat celu cestu.
v tvojom pripade (vo wrapperi, ktory mas urobit), bude pride do scriptu adresar (tym sa mysli jeho cela cesta) a vtedy v danom adresari najdes vhodny subor na otvorenie - do vimu potom posles vyskladany string vo forme "adresar" + "/" + "nazov suboru". ak pride subor ten musi prist tiez s celou cestou.

jj mockrát dík už jsem na to přišel :), teď to umí otevřít soubor když ho zadám, popř. adresář když zadám :) teď nevim jak udělat aby to vybíralo podle zadání:

Pokud není argumentem skriptu zadáno jméno editovaného souboru, skript z daného adresáře vybere soubor pro editaci. Výběr je následující:
Pokud bylo v daném adresáři editováno skriptem více souborů, vybere se soubor, který byl pomocí skriptu editován jako poslední. Editací souboru se myslí třeba i prohlížení jeho obsahu pomocí skriptu (tj. není nutné, aby byl soubor změněn).
Pokud byl zadán argument -m, vybere se soubor, který byl pomocí skriptu editován nejčastěji.
Pokud nebyl v daném adresáři editován ještě žádný soubor, jedná se o chybu.
Pokud nebyl zadán adresář, předpokládá se aktuální adresář.
Skript dokáže také zobrazit seznam všech souborů (argument -l), které byly v daném adresáři editovány.
Pokud byl zadán argument -b resp. -a (before, after), skript zobrazí seznam souborů, které byly editovány před resp. po zadaném datu. DATUM je formátu YYYY-MM-DD. Jsou zobrazeny soubory, které byly skriptem editovány od daného data včetně.

A mám problém s pochopením těchto dvou bodů:

Skript si pamatuje informace o svém spouštění v souboru, který je dán proměnnou WEDI_RC. Pokud není proměnná nastavena, jedná se o chybu. Formát souboru není specifikován.
Skript spouští editor, který je nastaven v proměnné EDITOR. Pokud není proměnná EDITOR nastavená, respektuje proměnnou VISUAL. Pokud ani ta není nastavená, jedná se o chybu.

Na věci ohledně zadání, pokud nečemu nerozumíš se tam můžeš ptát neomezeně.. :-)
Tak v tom souboru budeš mít např. uložené jméno posledního souboru, který byl editován. Takže třeba úplně nejprimitivnější řešení - uložíš ho na první řádek. Při načítání budeš vědět, že na prvním řádku je jméno toho naposledy editovaného souboru a načteš ten řetězec. Podobně třeba na dalších řádcích můžeš mít názvy ostatních souborů, které už byly editovány. To je jen příklad, ten formát si máš vymyslet podle sebe.

samozřejmě že se jedná o proměnnou prostředí. Podstatou je ověřit její existenci a případně vygenerovat chybovou hlášku.

Celý úkol je cca hodina práce pro začátečníka, podstatou je zvládnout práci se souborem a jeho parserování. Půlku lze doslova obšlehnout z rc skriptů prakticky libovolné linuxové distribuce.

Tazatel celý semestr spinkal a teď má pocit, že to nedává. Za půl roku už to zase zapomene, a takový člověk je do praxe k ničemu.

ja sice nie som bash zaciatocnik, ale hodina by mi bola asi malo. predsalen ti zabere cas aj nejake to testovanie a vypiplanie :).
ak dotycny aj spal, tak by mu nemalo robit problem urobit to. staci google a trochu rozmyslat. bash je dost pouzivany a na vsetko najde clovek na nete navody, snippety atd. Aj keby mu to trvalo cely den, tak si to postupne posklada.

To, co si dostal za ulohu spravit robi v Linuxe MidnightCommander (jeho interny editor), dokoca este lespie. Pamata si aj posledny editovany riadok z kazdeho suboru, ktory bol prostrednictvom neho editovany a nastavi kurzor na tento riadok. Vyskusaj obkukat ako to robi. Pouziva na to subory s historiou, kde ma ulozene commandy a dalsie veci.

Vyber argumenov v skriptoch riesim takto:

# Parsing parameters
for i in $@; do
  if [ "$INFC" = "1" ]; then INFC=0; IFACE=$i; fi
  if [ "$i" = "-i" ]; then INFC=1; fi
  if [ "$i" = "-help" ] || [ "$i" = "--help" ] || [ "$i" = "/?" ]; then  HELP=1; fi
done

if [ "$HELP" = "1" ]; then
  echo
  echo "Usage: script [-i] [--help]"
  echo "   -i   Use this name interface."
  exit 0
fi

Zpět do poradny Odpovědět na původní otázku Nahoru