Portál AbcLinuxu, 3. května 2025 11:10

Bešové laskominy

26.5.2005 16:03 | Přečteno: 2023× | BASH | poslední úprava: 27.5.2005 08:02

Občas by člověk potřeboval něco naprogramovat v BASHi a nepamatuje si, nedělá to často a tak. No a k tomu by se mu hodily nějaké tu základní konstrukce vytesané do webu. Třeba zrovna dnes jsem hledal způsob jak se pracuje s proměnými jejichž název je v nějaké proměné. Paradoxní, že jsem hledal svůj vlastní příspěvek a v něm obsažený příklad.

#!/bin/bash
foo () {
  local var=BAR_$1
  eval $var=$2
  echo ${!var}
}
foo Ahoj svete     # melo by vypsat "svete"
                   # uvnitr funkce by mela vzniknout promenna
                   # BAR_Ahoj="svete"
echo $BAR_Ahoj
exit 0

Fixní adresář

Jak se vždy přepnout do adresáře kde je umístěn script a dělat cosik relativně k tomuto adresáři?

# go to root directory of project
origdir=$(pwd)
cd ${0%/*}

Co udělat s parametrem od uživatele, když nám zadá cestu k nějakému souboru (když relativní tak zpravidla relativní k původnímu umístění).

[ ${1:0:1} == '/' ] &&
  filename=$1 ||
  filename=$origdir/$1

Uklidit po sobě

Ať se stane cokoli, měli bychom po sobě uklidit. Teda pokud se nebjeví nějakej "umětel" a nepošle nám SIGKILL.

#exit clean
clean() {
  rm -rf $clist $dlist $packdir
}

trap clean EXIT

Error handling

Něco málo k hezkým chybovým hláškám.

#error messages
error() {
  local exitcode=$1
  shift
  [ $exitcode != 0 ] && local prefix="error $exitcode:"
  errormsg "$prefix $@"
  exit $exitcode
}
errormsg() { echo "${0##*/}: $@" >&2 ; }

Debug

Občas se hodí udělat ten program trochu ukecanější.

#debug info
debug() {
  [ "$debug" == 1 ] && errormsg "debug: $@"
}
debugvar() {
  for i
  do 
    debug "${IFS:1:1}variable $i: '${!i}'"
  done
}

Parametry

Tohle už tu bylo, ale trocha opakování ještě nikoho nezabila.

# usage
usage() {
  cat >&2 <<EOF

Usage: ${0##*/} [switches] [release_type]
  -h | --help print help
  -c | --create print template for defined files list (to stdout)
  -l <filename> | --listfile=<filename> determine alternative filename for listfile
  -t | --test only test listfile
  -d | --debug  print debug informations

EOF
  [ $# -ge 1 ] && exit $1
}

# get options
params=$(
    getopt -n "${0##*/}" -l help,create,listfile:,test,debug -o hcl:td -- "$@"
  )
[ $? != 0 ] && usage 1

# remove quotes
eval set -- "$params"
unset params

# handle parameters
while :
do
  case "$1" in
    -h|--help) usage 0;;
    -c|--create) create_listfile ;;
    -l|--listfile) shift
      [ ${1:0:1} == '/' ] &&
        listfile=$1 ||
        listfile=$origdir/$1 ;;
    -t|--test) test=1;;
    -d|--debug) debug=1;;
    --) shift; break ;;
    *) error 32 "Internal Error: Inconsistent getopt params!";;
  esac
  shift
done

A to je pro dnešek vše přátelé.

       

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

26.5.2005 17:02 David Jaša | skóre: 44 | blog: Dejvův blog
Rozbalit Rozbalit vše man bash
Odpovědět | Sbalit | Link | Blokovat | Admin
Až zase jednou zjistím, že neumím hledat v man bash, tak se podívám sem. :-)
oVirt | SPICE
26.5.2005 17:23 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Pěkné
Odpovědět | Sbalit | Link | Blokovat | Admin
Bookmarkováno :-)
26.5.2005 20:40 doubleZ | skóre: 24 | blog: smazano
Rozbalit Rozbalit vše Re: Pěkné
Diky! :-)
27.5.2005 01:21 jm
Rozbalit Rozbalit vše Uklid...
Odpovědět | Sbalit | Link | Blokovat | Admin
tak by jsme
Et tu, Brute? :-)
27.5.2005 07:58 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: Uklid...
Fixed.

P.S.: A já myslel, že další pochvala :-(
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
27.5.2005 10:06 jm
Rozbalit Rozbalit vše Re: Uklid...
Ale no joo, ja uz to mam taky zabookmarkovano, ale nemuzem te prechvalit, no... ;-)

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.