[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Evaluacio de variables en bash



> més o menys seria això, que consti que no he repassat la sintaxi perquè
> és tard i demà em llevo a les 7 per anar a cole.
> 
Be, moltes gracies a tohom per les seves respostes, pero em sembla que no
m'he explicat gaire be :)

El millor em sembla que sera posar la part "interessant" del codi que tinc
ara.

Actualment primer llegeixo el fitxer de configuracio i despres sobreescric
amb les variables de la linia de comandes, peti qui peti, tot i que continuo
sense arreglar el problema de les variables "recursives":

--- fitxer.conf ---
DIST=Test
VER=0.1
# Location options
# SEARCHPATH already exists pointing to the root dir of dscdbuilder
ROOT=/espai
HDDIR=HD_contents
# -
HDDIST=$ROOT/$HDDIR/${DIST}_$VER

# Other options
FULL_STAGES="base clean templates"

--- script.sh ---
# Carrego la configuracio del fitxer de conf ($CONFIG), i despres
# de la linia de comandes
if [ "$1" = "-v" ]; then
  load_config "$2"
  shift 2
else
  load_config
fi
  
function load_config
{
  [ -f $CONFIG ] || error "Could not find config file $CONFIG"
  # aixi es carreguen totes les variables de configuracio del fitxer
  # $CONFIG com si les declares a ma
  . $CONFIG
  # aquesta es una guarrada per tractar el cas de la variable
  # 'FULL_STAGES', que conte multiples paraules i el "for i ...; do"
  # llegeix paraula a paraula...
  # es pot llegir linia a linia ??????
  local VAR="foo"
  local VAL="bar"
  for i in `echo $1 | sed -e s/"\,"/" "/`; do
    # detect multiword variables
    if [ -z `echo $i | grep '='` ]; then
      # encara estem en una variable multiparaula
      VAL="$VAL $i"
    else
      # exportem la variable anterior i agafem els continguts de l'actual   

      # ($i)
      export $VAR="$VAL"
      echo "DEBUG: Overwriting $VAR=$VAL"
      VAR=`echo $i | cut -f 1 -d "="`
      VAL=`echo $i | cut -f 2 -d "="`
    fi
  done
  # exportem la variable anterior
  export $VAR="$VAL"
  echo "DEBUG: Overwriting $VAR=$VAL"
}

Com podeu veure, si faig
$ dscdbuilder.sh -v HDDIST=/tmp
HDDIST tindra el valor "/tmp", pero si faig
$ dscdbuilder.sh -v VER=1
HDDIST tindra per valor "/espai/HD_contents/Test_0.1", enlloc de
"/espai/HD_contents/Test_1"

El codi anterior (el que primer carrega les variables de la linia de
comandes i despres les del fitxer de conf, si i nomes si, no s'han
especificat a la linia de comandes), es aquest (que intentava solucionar
aquest problema de "recursivitat" en HDDIST):

--- script.sh ---
if [ "$1" = "-v" ]; then
  store_vars "`echo $2 | sed -e s/"\,"/" "/`"
  shift 2
fi
load_config

# "activa" i assigna un conjunt de variables nomes si no han estat 
# ja "activades" (ho comprova add_var)
function store_vars
{
  local VAR="foo"
  local VAL="bar"
  for i in $1; do
    # detect multiword variables
    if [ -z `echo $i | grep '='` ]; then
      VAL="$VAL $i"
    else
      add_var $VAR && export $VAR=$VAL
      VAR=`echo $i | cut -f 1 -d "="`
      VAL=`echo $i | cut -f 2 -d "="`
    fi
  done
  add_var $VAR && export $VAR=$VAL
}

function add_var
{
  case "$REGISTERED" in *$1*) return 1;; esac
  REGISTERED="$REGISTERED $1"
}

function load_config
{
  [ -f $CONFIG ] || error "Could not find config file $CONFIG"
  # carreguem totes les variables del fitxer de conf igual que les de
  # linia de comandes, store_vars ja comprobara si cal o no
  store_vars "`grep "=" $CONFIG | grep -v "^#"`"
}


Com veieu, en el cas de HDDIST, mai te un valor "valid" sino que resulta que
el valor de HDDIST es sempre "$ROOT/$HDDIR/${DIST}_$VER" i no s'avalua, tal
com jo dic, recursivament.

AQUEST es, doncs, el meu problema.

En fi, no se si amb aixo ho he deixat mes clar, ho he enrevesat tot amb
detalls innecessaris (he intentat deixar el minim codi possible) o si ni
tansols algu ha arribat fins aqui XD

En fi, si algu ha arribat fins aqui, MOLTES GRACIES!! i si a sobre em pot
ajudar... en fi, aleshores moltissimes graces :)

Per cert, algu em va proposar fer-ho amb algun altre llenguatge mes decent
(ara no recordo el nom, ho sento), pero el cas es que aquesta, l'unica part
complicada, es bastant petita comparada amb la resta, que son tot de crides
a utilitats externes, i crec que es veu mes clar aixi que amb crides des de
perl (a part que perl es un dels meus punts pendents ;))

Doncs, au, moltissimes gracies, encara que nomes sigui per no borrar el
missatge en veure el subject :P

-- 
NEU: GMX ProMail mit bestem Virenschutz http://www.gmx.net/de/go/mail
+++ Empfehlung der Redaktion +++ Internet Professionell 10/04 +++



Reply to: