Nowe posty

Autor Wątek: [bash] podstawianie wartosci  (Przeczytany 4047 razy)

kordi

  • Gość
[bash] podstawianie wartosci
« dnia: 2012-09-28, 19:23:42 »
Moim drodzy!
Mam problem ze skryptem:
li=164

lili=0
lics=2.1
lik=1.3
lina=0.1
lirb=1.5

for x in li
 do
 for y in li na k rb cs
   do

    C=$(echo "scale=10; (${x}*${x}${y})" | bc)
Podstawiane sa tylko litery.
Natomiast chcialbym aby za ${x} byla podstawianawartosc 164,
a za ${x}${y} podstawiane byly kolejno wartosci 0, 2.2, 1.3, 0.1, 1.5


Czy moglibyscie mi troche pomoc?

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
[bash] podstawianie wartosci
« Odpowiedź #1 dnia: 2012-09-28, 22:50:04 »
1)
Po co tak?
To jest zadanie, czy sam wymyśliłeś tak straszliwie zawiły skrypt?
Jeśli sam, to zaprojektuj go całkowicie od nowa. Użyj jakiejś tablicy, czy czegokolwiek rozsądniejszego niż dobieranie się pętlą do nazw zmiennych...

2)
Rozwiązaniem może być eval:
#!/bin/sh

li=164

lili=0
lics=2.1
lik=1.3
lina=0.1
lirb=1.5

for x in li; do
    for y in li na k rb cs; do
        X=$( eval echo "\\$$x" )
        XY=$( eval echo "\\$$x$y" )
        string="scale=10; $X*$XY"
        echo $string
        # ...
    done
done

# ...

kordi

  • Gość
[bash] podstawianie wartosci
« Odpowiedź #2 dnia: 2012-09-29, 10:57:57 »
Bardzo dziekuje za pomoc! Troche utrudnilam sobie zadanie i chcialabym zrobic warunek, czy dana wartosc isnieje.
Mam nastepujace wartosci:
na=162.6

lina=0.1
nana=0
nacs=1
nak=1
narb=1.3
oraz petle:
for x in li; do
    for y in li na k rb cs; do
      .....
   done
done
Jednakze wykonujac te petle nie mamy zmiennej nali, tylko lina. Chcialbym wprowadzic warunek, czy zmienna istnieje, jesli nie, to $x i $y zamienic miejscami.

Wiem jak to sie robi na plikach:
if [ -e ~/skrypt/"${x}${y}"_plik.txt ] ; then
ale nie wiem jak to zrobic na zmiennych.

kordi

  • Gość
[bash] podstawianie wartosci
« Odpowiedź #3 dnia: 2012-09-29, 15:49:42 »
Udalo mi sie czesciowo rozwiazac roblem:
for x in na  ; do
    for y in li na k rb cs; do
        X=$( eval echo "\\$$x" )
       # XY=$( eval echo "\\$$x$y" )

  if [ -n $( eval echo "\\$$x$y" ) ] ; then
        XY=$( eval echo "\\$$x$y" )
        string=$(echo "scale=10; $X*$XY" |bc)
        echo $string
  else
    XY=$( eval echo "\\$$y$x" )
     string=$(echo "scale=10; $X*$XY" |bc)
        echo $string
  fi
Jednakze dla nali nie zmienia zmiennej na lina i wyskakuje blad syntax error.
Czymoglibyscie podpowiedziec mi gdzie mam blad?

mgoblp

  • Gość
[bash] podstawianie wartosci
« Odpowiedź #4 dnia: 2012-09-29, 18:42:01 »
O to chodzi?
#!/bin/sh
na=182
li=164

lili=0
lics=2.1
lik=1.3
lina=0.1
lirb=1.5
nana=0.334

for x in na  ; do
    for y in li na k rb cs; do
        X=$( eval echo "\\$$x" )
        tXY=$( eval echo "\\$$x$y" )
        tYX=$( eval echo "\\$$y$x" )
        echo "tXY=$tXY"

  if [ ! "x$tXY" = "x" ] ; then
        echo "nie zamienione"
        XY=$( eval echo "\\$$x$y" )
        string=$(echo "scale=10; $X*$XY" )
        echo "string=$string"
        echo $string | bc
  else
       if [ ! "x$tYX" = "x" ] ; then
            echo "zamienione"
            XY=$( eval echo "\\$$y$x" )
            string=$(echo "scale=10; $X*$XY" )
            echo "string=$string"
            echo $string | bc
       else
            echo "brak obu zmiennych"
       fi
  fi
echo "XY=$XY"
XY=
    done
done

xavery

  • Gość
[bash] podstawianie wartosci
« Odpowiedź #5 dnia: 2012-10-01, 14:24:55 »
Jejku, co Wy tu wyprawiacie?:) Jednoelementowa pętla, referencje symboliczne... Shame on You:)
Nie wiem co dokładnie założycielka chce osiągnąć ale do przemnożenia listy wartości przez jedną wartość nie trzeba takich piętrowych konstrukcji. Coś takiego wystarczy:

li=164
C=0

lili=0
lics=2.1
lik=1.3
lina=0.1
lirb=1.5

for i in $lili $lics $lik $lina $lirb; do
  C=`echo "scale=10; $li * $i"  | bc`
  echo $C
done
A do tworzenia symbolicznych referencji (czy jak to się tam nazywa) to w bash'u jest specjalna konstrukcja:

a=raz
b=a
echo ${!b}
Ale nie próbujcie tego ani w domu ani w pracy ani w szkole ani gdziekolwiek indziej:)