.bat: Loop verlassen geht nicht

Hallo, der User soll Befehle mit Leerzeichen eingeben können. Wenn sie/er aber nix eingibt, dann soll die Loop verlassen werden.

a)

:neu1
set /p myc=Bitte Befehl:
if [%myc%] == [] goto neu2
php.exe C:\Users\User\Downloads\fb_tools\fb_tools.php fb sh %myc%
goto neu1
:neu2
pause

b)

:neu1
set /p myc=Bitte Befehl:
if "%myc%" == "" goto neu2
php.exe C:\Users\User\Downloads\fb_tools\fb_tools.php fb sh %myc%
goto neu1
:neu2
pause

Fall a) erkennt Eingaben mit Leerzeichen als Leerstring.

Fall b) stürzt bei Leereingaben ab.

Wie geht es richtig? Danke schon mal.

Hab’s schon herausgefunden, es fehlte noch ein leeres set myc=:

c)

:neu1
set myc=
set /p myc=Bitte Befehl:
if "%myc%" == "" goto neu2
php.exe C:\Users\User\Downloads\fb_tools\fb_tools.php fb sh %myc%
goto neu1
:neu2
pause

denn bat hat die Eigenschaft, dass sonst in myc noch der vorherige Wert steht, wenn nix eingegeben wurde. :confused:

1 Like

Hab es auch herausgefunden, der Raw-String muss unbedingt gequotet werden…

php_smart () {
  php7 ~/Downloads/fbtools/fb_tools.php fb sh $@
}
php_smart_loop () {
  while true; do
    echo "Bitte Befehl:"
    read -r befehle
    if [[ -z "$befehle" ]]; then break 1; fi
    php_smart $(printf %q $befehle)
  done
}
php_all_leds () {
  php_smart set led1 $@
  php_smart set led2 $@
  php_smart set led3 $@
}
php_all_leds_dimm () {
  php_all_leds dimm:$1
}

:slight_smile:

Hm, nun wollte ich das „Äquivalent“ für bash schreiben:

d)

php_smart () {
  echo "fb sh $@"
  php7 ~/Downloads/fbtools/fb_tools.php fb sh $@
}
php_smart_loop () {
  while true; do
    echo "Bitte Befehl:"
    befehle=""
    read -r befehle
    if [[ -z "$befehle" ]]; then break 1; fi
    echo "$befehle"
    php_smart "$befehle"
  done
}

Leider geht das nicht:

php_smart_loop
Bitte Befehl:
list     
list
fb sh list
... hier Ausgabe ...
Bitte Befehl:
info led3
info led3
fb sh info led3
Unbekannte Argumente angegeben!
Bitte Befehl:

Das heißt, wenn die befehle keine Leerzeichen enthalten, geht es, sonst nicht… Hat jemand Idee?

Edit: Der Aufruf php_smart info led3 funktioniert tadellos. Es sollte doch auch programmatisch funktionieren. :frowning_face:

Ich würde sowas immer erst im kleinen testen. Das Problem ist die Eingabe, also mach nur im kleinen die Eingabe und gib diese aus.

while IFS='$\n' read -r line; do
    echo $line
done

Das wäre (ungetestet) etwas, das ich probieren würde. Der Unterschied ist dieses IFS mit dem Du den Trenner setzt. (Internnal Field Separator)

Mit

funktioniert es. Die Beiträge wurden nur in umgekehrter Reihenfolge freigeschaltet.