Allt från Computex 2023

Bash-skript - spara värde tills nästa gång skriptet körs?

Permalänk
Medlem

Bash-skript - spara värde tills nästa gång skriptet körs?

Hej
Jag håller på och klurar ut ett bash-skript men har fastnat på en sak.
Skriptet kommer att ta emot en parameter flera gånger. För varje gång som parametern som skickas med tex är 1 så skall den åka en variabel med ett värde. Så på något sätt så måste jag spara detta värde tills nästa gång skriptet körs. Men hur gör jag det? Jag skulle kunna skriva och läsa från en fil, men det verkar klumpigt tycker jag, kan man inte sätta någon slags tillfällig variabel i systemet som är åtkomstbar vid senare tillfälle?

Enkelt förklara menar jag såhär:
exec /usr/bin/app 1
# variabel $one skall då bli 1
exec /usr/bin/app 1
# variabel $one skall då vara 2

Hoppas ni förstår

MVH Niclas

Visa signatur

Har bytt namn från: nulleman ~ Blogg: http://skorpion.se
MacBook Pro: 15.4' ~ 1.83GHz ~ 1512MB RAM ~ 80GB HDD
Medlem i signaturen blodtörstiga Appleanvändare

Permalänk
Medlem

testa lägga till detta i slutet av ditt script

echo "#!/bin/bash\nMINVARIABEL=$MITTVÄRDE" > /tmp/tillsnästagång

och detta i början (obs . / är inte ./)

. /tmp/tillsnästagång

Systemvariabler tycker jag känns lite onödigt, smidigare med filer

Visa signatur

Hur man installerar program i *nix | There is no Swedish conspiracy

these days you can't use the Web at 2400 baud because the ads are 24KB - Bill Joy

Permalänk
Medlem

Jag skulle nog gärna vilja använda systemvariabler för de ska användas ofta och jag vill ha allt i en vektor dessutom. Det blir nog lättare för mig i slutändan ändå.

I en terminal så kan man ju använda export för att sätta systemvariabler, men gör jag det i ett skript så fungerar det inte.
Har testat detta:
export MITTNAMN="Niclas"

och sen listat systemvariabler med export -p men då finns inte MITTNAMN med????

/Niclas

Visa signatur

Har bytt namn från: nulleman ~ Blogg: http://skorpion.se
MacBook Pro: 15.4' ~ 1.83GHz ~ 1512MB RAM ~ 80GB HDD
Medlem i signaturen blodtörstiga Appleanvändare

Permalänk
Medlem

det är för att när du kör ett script så spawnas en ny session som avslutas när scriptet slutar. Vill du köra ett script i din session måste du köra det med ". /mitt/script".
Men som sagt det är betydligt lättare att source'a ett temporärt script.

Visa signatur

Hur man installerar program i *nix | There is no Swedish conspiracy

these days you can't use the Web at 2400 baud because the ads are 24KB - Bill Joy

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av skorpion
Jag skulle nog gärna vilja använda systemvariabler för de ska användas ofta och jag vill ha allt i en vektor dessutom. Det blir nog lättare för mig i slutändan ändå.

I en terminal så kan man ju använda export för att sätta systemvariabler, men gör jag det i ett skript så fungerar det inte.
Har testat detta:
export MITTNAMN="Niclas"

och sen listat systemvariabler med export -p men då finns inte MITTNAMN med????

/Niclas

Experimenterade lite och kom fram till att "export VARIABEL=1; export -p | grep VARIABEL" ger en output i programmet, men VARIABEL finns inte kvar efteråt, precis som du sa. Min gissning är att det har att göra med att programmet körs som en separat process, men är inte så insatt i sådana detaljer, så är mycket möjligt att jag har fel. Jag tycker annars att lösningen med en fil i /tmp/ verkar vara den bästa lösningen.

Visa signatur

Stationär: Intel-baserad, Arch + KDE
Bärbar: Dell XPS 13, Arch + KDE

Permalänk
Medlem

Variabler kan ärvas neråt (subprocesser) inte uppåt.

Din lösning är att skriva ut variablerna till en fil och sedan läsa (sourca) in dom.

Visa signatur

Kriga mot min brute: http://gunnard.se.mybrute.com om du vågar :D

Permalänk
Medlem

Okej, det har blivit systemvariabler ändå

Men nu har jag ett problem, det går ju tydligen inet att skapa två-dimensionelle vektorer i bash så jag har skapat flera vektorer som har namn liknande chr1 chr2 chr3
Nu vill jag skriva ut ett värde från en av dessa vektorer och ahr denna koden
echo ${chr$1[${rw2_kbd[$1]}]}
men det blir fel vid första $1, jag vet inte hur jag skall göra så det funkar, har testat att omsluta med måsvingar på olika sätt, men det fungerar icke.
${chr$1[${rw2_kbd[$1]}]}
är samma som
${chr1[${rw2_kbd[$1]}]}
då jag satta $1 till 1

/Niclas

Visa signatur

Har bytt namn från: nulleman ~ Blogg: http://skorpion.se
MacBook Pro: 15.4' ~ 1.83GHz ~ 1512MB RAM ~ 80GB HDD
Medlem i signaturen blodtörstiga Appleanvändare

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av skorpion
Nu vill jag skriva ut ett värde från en av dessa vektorer och ahr denna koden
echo ${chr$1[${rw2_kbd[$1]}]}
men det blir fel vid första $1, jag vet inte hur jag skall göra så det funkar, har testat att omsluta med måsvingar på olika sätt, men det fungerar icke.

eval echo \${chr$1[${rw2_kbd[$1]}]}

Permalänk
Medlem

Om jag vill använda det där i en while-sats, hur ska det stå då?

while [ ${#chr$1[@]} != $count ]
fungerar ju icke. Hur ska det stå då?

Visa signatur

Har bytt namn från: nulleman ~ Blogg: http://skorpion.se
MacBook Pro: 15.4' ~ 1.83GHz ~ 1512MB RAM ~ 80GB HDD
Medlem i signaturen blodtörstiga Appleanvändare

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av skorpion
while [ ${#chr$1[@]} != $count ]
fungerar ju icke. Hur ska det stå då?

while eval [ \${#chr$1[@]} != $count ]

Permalänk
Medlem

Tack lefant!

Nu har det (som ni sa) strulat till sig med systemvariablerna så jag måste nog skriva till en fil som ni sa.
Men hur ska jag på enklast sätt skriva en vektor (eller liknande struktur) till en fil och sedan kunna läsa sen?

Såhär är min kod för tillfället:

#!/bin/sh chr0=(_) chr1=(.) chr2=(a b c) chr3=(d e f) chr4=(g h i j) chr5=(j k l) chr6=(m n o) chr7=(p q r s) chr8=(t u v) chr9=(w x y z) if [ -z ${rw2_kbd[$1]} ] then rw2_kbd[$1]=0 fi eval arc=\${#chr$1[@]} count=0 while eval [ \${#chr$1[@]} \> $count ] do if eval [ ${rw2_kbd[$1]} == $count -a $(( $arc - 1 )) != $count ] then rw2_kbd[$1]=$(( $count + 1)) export rw2_kbd break elif eval [ \${#chr$1[@]} == $(( $count + 1 )) ] then rw2_kbd[$1]=0 export rw2_kbd break fi count=$(( $count + 1 )) done eval key=\${chr$1[${rw2_kbd[$1]}]} echo $key export rw2_kbd xte "str $key"

Koden kan säkerligen göras mycket bättre, men just nu så är inte det högsta prioritet.

Det är rw2_kbd som behövs skrivas till en fil för att sedan läsas ifrån.

Skriptet är tänkt att fungera såhär:
/usr/bin/skript 4
skriver ett g till spar-filen
Kör man understående kommando igen inom 2 sekunder...
/usr/bin/skript 4
...så skrivs ett h till spar-filen
om man nu inte kör kommandot igen inom 2 sekunder så skall skriptet skriva ut aktuell bokstav till ett fönster
Alltså som ett mobiltangentbord
Hur den här tids-funktionen kommer se ut vet jag tyvärr inte ännu, har inte kommit på hur den skall göras så om ni har någora förslag så är jag tacksam.

MVH Niclas

Visa signatur

Har bytt namn från: nulleman ~ Blogg: http://skorpion.se
MacBook Pro: 15.4' ~ 1.83GHz ~ 1512MB RAM ~ 80GB HDD
Medlem i signaturen blodtörstiga Appleanvändare

Permalänk
Medlem

Annars fungerar ju:

VAR=`cat filfan 2> /dev/null`

Där skickas felmeddelandet till /dev/null (t.ex. när inte filen existerar).

Permalänk
Medlem

Tackar
Fast jag löste det innan själv. Jag behövde inte använda någon vektor utan det räckte att spara ett värde i en fil.
timeout-saken löste jag med att använda 3 skript!!! Verkar klumpiogt men jag vet inte annars hur jag skulle lösa det. Vi får se om jag tar och frågar i programmeringsforumet om någon vill göra om min 3 skript till ett enda kompilerat program. Skulle vara schysst isf.

Nu är det inte så mycket jag har kvar att göra, allt fungerar troligen som jag vill, men det är en sak som skulle vara underbart att ha med, nämligen OSD (On Screen Display)
Alltså så att aktuell bokstav visas på skärmen, precis som på mobiltelefoner.
typ: abC där aktuell bokstav då är c
Någon som vet hur man fixar sånt via bash? (eventuellt i samarbete med något anat program)

/Niclas

Visa signatur

Har bytt namn från: nulleman ~ Blogg: http://skorpion.se
MacBook Pro: 15.4' ~ 1.83GHz ~ 1512MB RAM ~ 80GB HDD
Medlem i signaturen blodtörstiga Appleanvändare

Permalänk
Medlem

installera xosd och använd osd_cat

Visa signatur

Hur man installerar program i *nix | There is no Swedish conspiracy

these days you can't use the Web at 2400 baud because the ads are 24KB - Bill Joy

Permalänk
Medlem

Åhh, tack. precis det jag sökte.

Ska klura lite med det här aBc
Men om ni direkt kommer på ett sätt att göra det så hojta till
Jag har en vektor som heter chr4 och har a b c som värden
chr4=(a b c)

Om vi säger att jag vill skriva ut B men ha resten av bokstäverna i vektorn med bredvid fast mindre, hur gör jag då?
De andra bokstäverna skall både vara före och efter
Tänkte mig något sånt här:
aBc #B är valt
bCa #C är valt och efter C så kommer A igen
cAb #A är valt och innan så kom C och efter kommer B

Förstår ni?

/Niclas

Visa signatur

Har bytt namn från: nulleman ~ Blogg: http://skorpion.se
MacBook Pro: 15.4' ~ 1.83GHz ~ 1512MB RAM ~ 80GB HDD
Medlem i signaturen blodtörstiga Appleanvändare