[fixed] script mit until und for-schleife tut nicht, was es

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
manes
Beiträge: 958
Registriert: 27.08.2007 11:26:54
Wohnort: Köln
Kontaktdaten:

[fixed] script mit until und for-schleife tut nicht, was es

Beitrag von manes » 07.03.2015 21:50:09

hallo forum,

ich habe hier ein script. anfangs soll es zwei benutzereingaben (zahlen) annehmen (valuelow und valuehigh), prüfen, ob der erste wert kleiner ist als der zweite, falls nein: erneute abfrage der werte, falls ja: beginnend bei dem niedrigeren wert (eingabe valuelow), die werte um jeweils 1 erhöhen und bei erreichen des höchsten wertes (valuehigh) etwas tun.

mit

Code: Alles auswählen

#!/bin/bash
until [[ $valuehigh -ge $valuelow ]]; do
read -e -p "valuelow > " valuelow
read -e -p "valuehigh > " valuehigh
done
for (( value=$valuelow; $value<=valuehigh; value=$value+1 ))
do
echo "$value"
done
fragt das script gar keine werte ab, sondern spuckt direkt ein

Code: Alles auswählen

line 6: ((: value=: syntax error: operand expected (error token is "=")
aus. ich bin sicher, ähnliche konstruktionen schon benutzt zu haben, sehe den fehler nicht und kann ihn nicht einmal ordentlich benennen (deshalb die unspezifische betreffzeile).
kann mir jemand den weg weisen?

edit:
das funktioniert

Code: Alles auswählen

#!/bin/bash
until [[ $valuehigh -ge $valuelow ]] && [[ $step -gt 0 ]]; do
read -e -p "valuelow > " valuelow
read -e -p "valuehigh > " valuehigh
read -e -p "step > " step
done
for (( value=$valuelow; $value<=valuehigh; value+=$step ))
do
echo "$value"
done
aber ich will diese angabe von einem "step" gar nicht, die schrittweite soll 1 sein.

grüße
manes
Zuletzt geändert von manes am 25.03.2015 01:21:07, insgesamt 1-mal geändert.
Sometimes you have a programming problem and it seems like the best solution is to use regular expressions; now you have two problems.
David Mertz


Benutzeravatar
manes
Beiträge: 958
Registriert: 27.08.2007 11:26:54
Wohnort: Köln
Kontaktdaten:

Re: script mit until und for-schleife tut nicht, was es soll

Beitrag von manes » 07.03.2015 22:53:32

danke, hilft leider nicht. sorry, habe ich nicht erwähnt, ich hatte schon einige variationen der zeile

Code: Alles auswählen

for (( value=$valuelow; $value<=valuehigh; …
ausprobiert.diese bringen auch nicht das gewünschte ergebnis:

Code: Alles auswählen

for (( value=$valuelow; $value<=valuehigh; value=value+1 ))
for (( value=$valuelow; $value<=valuehigh; value=$value+1 ))
for (( value=$valuelow; $value<=valuehigh; value=$((value+1)) ))
for (( value=$valuelow; $value<=valuehigh; value++ ))
und überhaupt, diegewünschten benutzereingaben werden nicht abgefragt. mich deucht, das problem liegt woanders.
selbst bei stackoverflow.com finde ich keine hinweise, aber vielleicht ist mein englisch auch zu rudimentär…

grüße
manes
Sometimes you have a programming problem and it seems like the best solution is to use regular expressions; now you have two problems.
David Mertz

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: script mit until und for-schleife tut nicht, was es soll

Beitrag von NAB » 08.03.2015 00:39:47

Die three-expression-Syntax ist etwas eigen:

Code: Alles auswählen

#!/bin/bash
for (( i=1; i<=5; i++ ))
do
   echo "Durchlauf $i"
done
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

Benutzeravatar
manes
Beiträge: 958
Registriert: 27.08.2007 11:26:54
Wohnort: Köln
Kontaktdaten:

Re: script mit until und for-schleife tut nicht, was es soll

Beitrag von manes » 08.03.2015 01:22:16

NAB hat geschrieben:Die three-expression-Syntax ist etwas eigen:

Code: Alles auswählen

#!/bin/bash
for (( i=1; i<=5; i++ )); do echo "Durchlauf $i"; done
das prinzip ist mir wohl halbwegs klar. an welcher stelle gehorcht mein o.g. script den regeln nicht? i kann doch auch durch variablen ersetzt werden, siehe mein beispiel zwei.
kann mir jemand sagen, wo mein fehler liegt?

grüße
manes
Sometimes you have a programming problem and it seems like the best solution is to use regular expressions; now you have two problems.
David Mertz

Benutzeravatar
Phineas
Beiträge: 348
Registriert: 20.06.2012 20:26:19

Re: script mit until und for-schleife tut nicht, was es soll

Beitrag von Phineas » 08.03.2015 02:40:40

Code: Alles auswählen

#!/bin/bash

until [ ${valuehigh:-0} -gt ${valuelow:-0} ]; do
    read -ep "valuelow > " valuelow
    read -ep "valuehigh > " valuehigh
done

for (( value=valuelow; value<=valuehigh; value++ )); do
    echo "$value"
done
Eine aktuelle Bash vorausgesetzt.

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: script mit until und for-schleife tut nicht, was es soll

Beitrag von NAB » 08.03.2015 02:47:14

manes hat geschrieben:das prinzip ist mir wohl halbwegs klar. an welcher stelle gehorcht mein o.g. script den regeln nicht?
Zähl mal deine Dollars ... ich hab weniger. i ist eine Variable :-)
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

Benutzeravatar
Phineas
Beiträge: 348
Registriert: 20.06.2012 20:26:19

Re: script mit until und for-schleife tut nicht, was es soll

Beitrag von Phineas » 08.03.2015 02:50:52

Es lag wohl eher an der hoffnungslos schrägen Bedingung für until.

Benutzeravatar
manes
Beiträge: 958
Registriert: 27.08.2007 11:26:54
Wohnort: Köln
Kontaktdaten:

Re: script mit until und for-schleife tut nicht, was es soll

Beitrag von manes » 08.03.2015 11:15:55

danke für die hilfe!
NAB hat geschrieben:Zähl mal deine Dollars ... ich hab weniger. i ist eine Variable :-)
äh, ja. :oops: ich schieb das mal der einfachheit halber auf die uhrzeit *hust*.
Phineas hat geschrieben:

Code: Alles auswählen

until [ ${valuehigh:-0} -gt ${valuelow:-0} ]; do (…)
mit -ge funktioniert das nicht.
das geht:

Code: Alles auswählen

until [ ${valuehigh:-0} -ge ${valuelow:-1} ]; do (…)
ich täte das ja gerne noch verstehen. was macht dieses :-0 in geschweiften klammern mit der variablen? das gehört doch in den bereich parameter expansion? was muß/ soll denn da expandiert werden?
ist das

Code: Alles auswählen

${var:-word}             # if var is defined AND NOT EMPTY, use var; otherwise, "word"
oder

Code: Alles auswählen

${string: -1}   # The last character of string
? (von hier).

verwirrte grüße
manes
Sometimes you have a programming problem and it seems like the best solution is to use regular expressions; now you have two problems.
David Mertz

Benutzeravatar
detix
Beiträge: 1702
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Re: script mit until und for-schleife tut nicht, was es soll

Beitrag von detix » 08.03.2015 11:23:55

Vor der ersten Benutzung müssen die Variablen deklariert sein, es hätte gereicht:

Code: Alles auswählen

#!/bin/bash
valuehigh=0
valuelow=1

until [[ $valuehigh -ge $valuelow ]]; do
  read -e -p "valuelow > " valuelow
  read -e -p "valuehigh > " valuehigh
done
for (( value=$valuelow; value<=$valuehigh; value++ )); do
  echo "$value"
done
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

Benutzeravatar
manes
Beiträge: 958
Registriert: 27.08.2007 11:26:54
Wohnort: Köln
Kontaktdaten:

Re: script mit until und for-schleife tut nicht, was es soll

Beitrag von manes » 08.03.2015 11:40:35

detix hat geschrieben:Vor der ersten Benutzung müssen die Variablen deklariert sein
das passiert doch bei until:

Code: Alles auswählen

read -e -p "valuelow > " valuelow
und vor der ersten äh "erwähnung" muß das ja auch nicht passieren. mein beispiel zwei kommt ja auch ohne deklarierung vor der until-zeile aus.

manes
Sometimes you have a programming problem and it seems like the best solution is to use regular expressions; now you have two problems.
David Mertz

Benutzeravatar
detix
Beiträge: 1702
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Re: script mit until und for-schleife tut nicht, was es soll

Beitrag von detix » 08.03.2015 12:55:54

Dein 2tes Beispiel funktioniert, da die step Variable auch noch nicht gesetzt ist und damit gewartet (until) wird, bis sie einen Wert bekommt.
Den Rest davor könntest du dir somit sparen:

Code: Alles auswählen

until [[ $step -gt 0 ]]; do ...
Da $valuehigh und $valuelow (im ersten Beispiel) ungesetzt den gleichen Wert (nichts) haben,
wird die until -Schleife zunächst überlesen, aber nicht in der for -Schleife.
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

Benutzeravatar
manes
Beiträge: 958
Registriert: 27.08.2007 11:26:54
Wohnort: Köln
Kontaktdaten:

Re: script mit until und for-schleife tut nicht, was es soll

Beitrag von manes » 25.03.2015 01:19:42

mit reichlich verspätung, dennoch herzlich: danke allen, die mir so bereitwillig geholfen haben!

grüße
manes
Sometimes you have a programming problem and it seems like the best solution is to use regular expressions; now you have two problems.
David Mertz

Antworten