• 1
  • 2
2009-11-20, 14:33
  #1
Medlem
Samus-Arans avatar
Hittade inget om programmering i unix i systemutvecklings forumet så jag postar här istället.

Har precis börjat med unix kodning och stöt på problem, fråga inte vad jag vill med det här skriptet för det vet jag inte ens själv

Kod:
#!/bin/bash

a=0001
b=0010
c=0011
d=0100
e=0101
f=0110
g=0111
h=1000
i=1001
j=1010
k=1011
l=1100
m=1101
n=1110
o=1111

strang=abcdefghijklmno
i=0

while [ 1 -eq 1 ];do

i=`expr $i + 1`
char=`echo $strang | cut -c$i`

echo $$char    <-------- Den raden!

sleep 0.5
done

Jag har en sträng med massa bokstäver, så cutar jag upp dem så det blir en bokstav för sig, sen vill jag att om det blir bokstaven j så ska 1010 skrivas ut som jag har i den variabeln.

Om jag har som det står nu så först exekverar den kommandot $$ som jag inte vet vad det gör men det blir något nummer och sen skriver den ut char. Har exprimenterat med citattecken men får det inte att fungera. Hoppas nu förstår vad jag är ute efter.

Tack på förhand

//Samus-Aran
Citera
2009-11-20, 16:52
  #2
Medlem
adequates avatar
Ska det verkligen vara två dollartecken, och inte ett?
Citera
2009-11-20, 17:21
  #3
Medlem
Samus-Arans avatar
Citat:
Ursprungligen postat av adequate
Ska det verkligen vara två dollartecken, och inte ett?

Ja asså jag vill ju skriva ut variablerna $a, $b, $c... Och $char skriver ut a b c så jag tänkte att $$char skriver ut $a, $b, $c... men icke. Fungerar ej

Någon annan som har nått tips på hur man kan göra?
Citera
2009-11-20, 17:43
  #4
Medlem
Darkwing Ducks avatar
Citat:
Ursprungligen postat av Samus-Aran
Ja asså jag vill ju skriva ut variablerna $a, $b, $c... Och $char skriver ut a b c så jag tänkte att $$char skriver ut $a, $b, $c... men icke. Fungerar ej

Någon annan som har nått tips på hur man kan göra?
Ha bara ett dollartecken före char.
Citera
2009-11-20, 17:44
  #5
Medlem
adequates avatar
Citat:
Ursprungligen postat av Darkwing Duck
Ha bara ett dollartecken före char.
Som sagt skriver det bara ut a, b, c osv.

TS: Jag har provat med variationer på:
Kod:
aoeu=$char
echo $aoeu
vilket intuitivt kanske borde funka, men icke.

EDIT: Allmänt förbättringstips: Du kanske borde kalla variabeln för något annat än i, typ p (som inte är upptaget av en konstant).
Citera
2009-11-20, 17:45
  #6
Medlem
Samus-Arans avatar
Citat:
Ursprungligen postat av Darkwing Duck
Ha bara ett dollartecken före char.

Då skriver den ju bara ut a, b ,c... Jag vill ju att den ska skriva ut värdet av variablerna där uppe!
tex, är det ett b så ska den skriva ut 0010. Är ni med på vad jag försöker med?
Citera
2009-11-20, 17:49
  #7
Medlem
Samus-Arans avatar
Citat:
Ursprungligen postat av adequate
Som sagt skriver det bara ut a, b, c osv.

TS: Jag har provat med variationer på:
Kod:
aoeu=$char
echo $aoeu
vilket intuitivt kanske borde funka, men icke.

EDIT: Allmänt förbättringstips: Du kanske borde kalla variabeln för något annat än i, typ p (som inte är upptaget av en konstant).

Ja man tycker ju det!
Oj det var klantigt av mig, byter till något bättre

Testade

echo \$$char vilket ger mig:
$a
$b
$c

Men jag vill ju ha värdena av variabeln $a... istället för att den skriver ut $a

Att detta skulle vara så klurigt!
__________________
Senast redigerad av Samus-Aran 2009-11-20 kl. 17:53.
Citera
2009-11-20, 18:02
  #8
Medlem
Darkwing Ducks avatar
Citat:
Ursprungligen postat av Samus-Aran
Då skriver den ju bara ut a, b ,c... Jag vill ju att den ska skriva ut värdet av variablerna där uppe!
tex, är det ett b så ska den skriva ut 0010. Är ni med på vad jag försöker med?
Ursäkta mig, jag läste slarvigt förut.

Det är raden
char=`echo $strang | cut -c$i`
som behöver fixas till, den rapar just bara upp en i taget av bokstäverna a-o i $strang.

Prova (jag har inte testat själv):
char="$`echo $strang | cut -c$i`"
Det borde först hämta bokstaven från sin position i $strang (precis som nu), och tack vare det första $-tecknet hämta värdet i variabeln med det namnet.
Citera
2009-11-20, 18:05
  #9
Medlem
Samus-Arans avatar
Citat:
Ursprungligen postat av Darkwing Duck
Ursäkta mig, jag läste slarvigt förut.

Det är raden
char=`echo $strang | cut -c$i`
som behöver fixas till, den rapar just bara upp en i taget av bokstäverna a-o i $strang.

Prova (jag har inte testat själv):
char="$`echo $strang | cut -c$i`"
Det borde först hämta bokstaven från sin position i $strang (precis som nu), och tack vare det första $-tecknet hämta värdet i variabeln med det namnet.

Tyvärr samma där Det som skrivs ut är:
$a
$b
$c
$d
...

Kanske är så jävligt att det inte går helt enkelt?
Citera
2009-11-20, 18:07
  #10
Medlem
adequates avatar
Citat:
Ursprungligen postat av Samus-Aran
Kanske är så jävligt att det inte går helt enkelt?
Var inte sån nu, ingenting är omöjligt.

EDIT: Testade med en array och for istf sträng och while:
Kod:
array=( a b c d e f g h i j k l m n o )

for char in ${array[@]};do

echo $char

done
... men med samma resultat; a, b, c etc skrivs ut. Även:
Kod:
array=( a b c d e f g h i j k l m n o )

for char in ${array[@]};do

aoeu=$char
echo $aoeu

done
ger detsamma. Skumt.

EDIT: Lite smått OT men kanske intressant: I Python kan det här lösas med två rader:
Kod:
for i, j in sorted(dict(a='0001', b='0010', c='0011', d='0100').iteritems()):
    print j
Väldigt inelegant fulhack, men ännu ett bevis på Pythons överlägsenhet.
__________________
Senast redigerad av adequate 2009-11-20 kl. 18:38.
Citera
2009-11-20, 19:35
  #11
Medlem
Darkwing Ducks avatar
Citat:
Ursprungligen postat av Samus-Aran
Tyvärr samma där Det som skrivs ut är:
$a
$b
$c
$d
...

Kanske är så jävligt att det inte går helt enkelt?

Det är klart att det går. Jag tror faktiskt jag har hittat en metod:

reference=`echo $strang | cut -c$i
char=`eval echo \\$$reference`

Alltså: i ett första steg hittar vi variabelnamnet, sedan kör vi den genom eval för att hitta värdet i variabeln med det namnet.
Du var på rätt spår tidigare, \$$reference hämtar värdet indirekt i en variabel. Men eftersom vi kör detta inom backticks (`) måste vi dessutom escape'a det uttrycket med en \ först.
...enkelt, va? :-)

Man kan lägga ihop alltsammans på en rad, åtminstone med hjälp av pipe-tecken. Men det här är en enklare syntax, med mindre risk för udda problem med skalet.
Citera
2009-11-20, 19:42
  #12
Medlem
adequates avatar
Citat:
Ursprungligen postat av Darkwing Duck

Det är klart att det går. Jag tror faktiskt jag har hittat en metod:

reference=`echo $strang | cut -c$i
char=`eval echo \\$$reference`

Alltså: i ett första steg hittar vi variabelnamnet, sedan kör vi den genom eval för att hitta värdet i variabeln med det namnet.
Du var på rätt spår tidigare, \$$reference hämtar värdet indirekt i en variabel. Men eftersom vi kör detta inom backticks (`) måste vi dessutom escape'a det uttrycket med en \ först.
...enkelt, va? :-)

Man kan lägga ihop alltsammans på en rad, åtminstone med hjälp av pipe-tecken. Men det här är en enklare syntax, med mindre risk för udda problem med skalet.
Hurra!

EDIT: Hela koden blir då något sånt här:
Kod:
#!/bin/bash

a=0001
b=0010
c=0011
d=0100
e=0101
f=0110
g=0111
h=1000
i=1001
j=1010
k=1011
l=1100
m=1101
n=1110
o=1111

strang=abcdefghijklmno

p=0

while [ 1 -eq 1 ];do

p=`expr $p + 1`
reference=`echo $strang | cut -c$p`
char=`eval echo \\$$reference`
echo $char

sleep 0.5
done
__________________
Senast redigerad av adequate 2009-11-20 kl. 19:45.
Citera
  • 1
  • 2

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in