Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: Juri1990 06 Října 2011, 12:12:34

Název: Základy bash
Přispěvatel: Juri1990 06 Října 2011, 12:12:34
Zdravím, do školy mám robiť skript a mám dve hlavné otázky, na ktoré som nenašiel zatiaľ odpoveď.
Ako prečítam nejaké veci z toho istého riadku ako spúšťam samotný skript, normálne read? skripi.sh /prva/cesta druha_cesta ...
Ako sa riešia prepínače, rovnako ako to prvé, len overujem znak '-', alebo to má nejaké špecifické riešenie?
Vopred ďakujem za všetkú pomoc.
Název: Re:Základy bash
Přispěvatel: RRRadek Neužil 06 Října 2011, 13:12:42
http://wiki.ubuntu.cz/Bash%20a%20skripty (http://wiki.ubuntu.cz/Bash%20a%20skripty)  ;)
Název: Re:Základy bash
Přispěvatel: ntz_reloaded 06 Října 2011, 13:53:39
$@ vsechny parametry, $1 .. $n je prvni az posledni parametr ... $0 by mel bejt samotnej skript
Název: Re:Základy bash
Přispěvatel: Juri1990 06 Října 2011, 14:00:45
Vďaka obom, už začínam trochu chápať. Tie návody som čítal, ale príklady nie, až teraz  ::)
Len ešte ako sa riešia prepínače, je nejaké zaužívané riešenie?
Název: Re:Základy bash
Přispěvatel: ntz_reloaded 06 Října 2011, 14:07:53
kazdy to resi jinak .. ja osobne nepouzivam **getopts ale spis **shiftuju .. tohle je ukazka z meho kodu:

Kód: [Vybrat]
## some functions
usage() {
    cat << 'EOF'
usage: irssi-for-solaris-sparc.bin [-h] [-b dir] [-t dir] [-x] [-X] [-V file] [-P opts] [-T term] [-U]

-h      : prints out this help message
-b dir  : a directory where will be irssi.sh placed, default is /usr/bin
-t dir  : temporary directory for unpacking files, default is /var/tmp/irssi-installer
-x      : don't delete temporary files
-X      : quit before installing so no changes will be made
-V file : where will be stored a pkgadd/pkgrm log, default is /dev/null
-P opts : additional pkgadd opts, default is "-G", refer to pkgadd(1m) manual
        : you must enclose opts in "doublequotas"
-T term : a $term will be used rather then xterm-color deployed by this installer
-U      : uninstall, if you changed where was a irssi.sh placed, you need to add a "-b dir" option

examples:
        irssi-for-solaris-sparc.bin ## just install everything with default settings
        irssi-for-solaris-sparc.bin -U -b /foo ## uninstall everything including /foo/irssi.sh
        irssi-for-solaris-sparc.bin -t /foo -x -X ## only unpack data archive into /foo and exits
        irssi-for-solaris-sparc.bin -b /bin -t /tmp/foo -x -V /tmp/foo/install.log ## install irssi.sh
               into /bin, use /tmp/foo for temporary data, won't delete them and save a log as /tmp/foo/install.log

background:
        This installer will do generally 3 things:
        - installs additional packages GNUglib, GNUirssi and GNUlibiconv compiled with prefix /opt/gnu
        - places a xterm-color terminal file which doesn't suck (like Sun's xtermc) in /usr/share/lib/terminfo/x
        - creates a /usr/bin/irssi.sh launcher (default path), which you will use for launching irssi

authors:
        xxx@opensuse.org - this installer
        xxx@synack.fi  - packager

EOF
    exit 0;
};

checkfail() {
    echo "$1";
    exit $2;
};

## parsing cli parameters and changing predefined variables
until test -z "$1"; do
    case "$1" in
        -h | --help ) usage;;
        -b ) bin_path="$2"; shift;
                test -w $bin_path || checkfail "$bin_path doesn't exist or you have no +w permissions there" 1;;
        -t ) tmp_path=$2; shift;;
        -x ) tmp_del=no;;
        -X ) pretend=yes;;
        -V ) verbose_logfile="$2"; shift;
                test -f $verbose_logfile && checkfail "$verbose_logfile already exists, choose another one, quitting .." 1;;
        -P ) pkgadd_opts="$2"; shift;;
        -T ) term="$2"; shift;;
        -U ) uninstall=yes;;
        * ) checkfail "bad parameter: \"$1\", try -h for help" 1;;
    esac
    shift;
done

^^ dal jsem tam pro jistotu i obsah funkce checkfail a --help aby se to lepe chapalo ..

ave, ntz
Název: Re:Základy bash
Přispěvatel: Juri1990 06 Října 2011, 15:45:57
Veľká vďaka, v c funguje switch len pre int(char), tak mi to nenapadlo, ale ak tu funguje pre string tak je to paráda :-)
Název: Re:Základy bash
Přispěvatel: ntz_reloaded 06 Října 2011, 16:02:40
Veľká vďaka, v c funguje switch len pre int(char), tak mi to nenapadlo, ale ak tu funguje pre string tak je to paráda :-)
nechapu o cem mluvis a jak to s tim souvisi .... psal jsem shift a ne switch
Název: Re:Základy bash
Přispěvatel: Juri1990 06 Října 2011, 16:06:20
sorry, vyzeralo to skoro ak switch
Název: Re:Základy bash
Přispěvatel: daysleeper 06 Října 2011, 18:31:14
Asi tím myslel to, že v C je switch(int), tzn. parametr může být jen integer, ale v bashi v podobném příkazu case je jako parametr word.
Název: Re:Základy bash
Přispěvatel: Juri1990 24 Října 2011, 14:03:51
Pomohli ste mi a mám ešte 2 otázky.
Ak chcem v nejakej funkcii v skripte používať argumenty zadané pri spustený skriptu, ako sa to dá spraviť? Nenapadlo ma iné riešenie ako namiesto funkcie použiť goto.
Ako odshiftovat všetky ďalšie prepínače? Zatiaľ mám toto, ale nefunguje mi to.
Kód: [Vybrat]
while [ "$2" = "-.*" ]; do
 shift
done
Název: Re:Základy bash
Přispěvatel: pacholik 24 Října 2011, 14:41:07
tak ty argumenty předáš funkci při volání - třeba všechny
Kód: [Vybrat]
funkce $@
> odshiftovat všechny další přepínače
jakej to má smysl?
Název: Re:Základy bash
Přispěvatel: Juri1990 25 Října 2011, 08:39:29
Vďaka, už to nepotrebujem riešiť, spravil som to cez -d $1 pretože potrebujem jeden prepínač a cesty.
Název: Re:Základy bash
Přispěvatel: Juri1990 25 Října 2011, 14:03:49
Mám ďalšiu otázku, ako normálne zapisovať do pola, existuje niečo také, že sa to vždy zapíše na koniec poľa, bez udania indexu? Momentálne mám toto, ale premenu "i" mi to neberie ako číslo.
Kód: [Vybrat]
cyklus
i=0
pole[$i]="$1"
i=$(($i+1))
koniec cyklu
Název: Re:Základy bash
Přispěvatel: pacholik 25 Října 2011, 14:58:03
něco o polích v bashi (http://www.linuxjournal.com/content/bash-arrays)