ubuntuusers.de

Bash: Einstelliger (unärer) Operator erwartet.

Status: Gelöst | Ubuntu-Version: Ubuntu MATE 20.04 (Focal Fossa)
Antworten |

Dakuan

Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6512

Wohnort: Hamburg

Ich verwende Scripte ja eher selten, daher kämpfe ich gerade wieder mit der Bash und bekomme obige Fehlermeldung. Ich will eigentlich nur mit einer leeren Eingabe das Script beenden.

Konsole:

manfred@samurai:~$ ./copy_th.sh
Thumbfile: 09a07341636427be71619794d779002a.png
./copy_th.sh: Zeile 12: [: 09a07341636427be71619794d779002a.png: Einstelliger (unärer) Operator erwartet.
cp ~/.vdata/09a07341636427be71619794d779002a.png ~/.cache/thumbnails/normal/
Thumbfile: 

Das fehlerhafte cript:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/bin/bash
#
source_dir=".vdata/"
destination_dir=".cache/thumbnails/normal/"

while read -p "Thumbfile: " input; do
    if [ $input -z ]; then break; fi
    echo "cp ~/$source_dir$input ~/$destination_dir"
    cp ~/$source_dir$input ~/$destination_dir
done

Was muss ich da ändern?

p.s. kopiert wird die Datei trotzdem.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11266

Wohnort: München

Das -z muss das erste Argument im Test sein und $input sollte gequotet werden (damit dein Test nicht kaputt geht, wenn der Wert von $input mehr als ein Element produziert, wenn er am IFS aufgetrennt wird):

1
if [ -z "$input" ]; then break; fi

Dakuan

(Themenstarter)
Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6512

Wohnort: Hamburg

Danke, das war's! Jetzt macht es was ich mir vorgestellt hatte.

... und $input sollte gequotet werden ...

Hatte ich anfangs auch, aber wenn man keine Ahnung hat ...

... wenn der Wert von $input mehr als ein Element produziert,...

Guter Hinweis, aber das kommt hier aber nicht vor. Ich füge den Dateinamen mit der Mittleren Maustaste ein. Ich will mit diesem Script ja nur "mal schnell" ein Versäumnis reparieren.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13216

Dakuan schrieb:

... wenn der Wert von $input mehr als ein Element produziert,...

Guter Hinweis, aber das kommt hier aber nicht vor. Ich füge den Dateinamen mit der Mittleren Maustaste ein. Ich will mit diesem Script ja nur "mal schnell" ein Versäumnis reparieren.

Das kann das Skript nicht wissen, weil es ja eine Eingabe liest. Insofern ist es besser, das gleich zu quoten, damit es Dir nicht kaputt geht, wenn aus irgendwelchen Gründen mal eine falsche Eingabe kommt.

Man kann das übrigens so umschreiben:

1
2
3
4
5
6
7
8
#!/bin/bash

source_dir=".vdata/"
destination_dir=".cache/thumbnails/normal/"

while read -p "Thumbfile: " input && [ -n "$input" ]; do
  cp -v ~/"$source_dir$input" ~/"$destination_dir"
done

schragge

Anmeldungsdatum:
27. Januar 2022

Beiträge: 181

^ Das oben kann auch von /bin/sh ausgeführt werden. Ist man zu faul zu quoten und will nicht POSIX-kompatibel bleiben, lässt Bash auch sowas zu:

1
2
3
4
5
6
7
8
#!/bin/bash

source_dir='.vdata/'
destination_dir='.cache/thumbnails/normal/'

while read -rp 'Thumbfile: ' input && [[ $input ]]
do cp -v ~/"$source_dir$input" ~/"$destination_dir"
done

Bash Reference Manual:

Word splitting and filename expansion are not performed on the words between the [[ and ]]

Dakuan

(Themenstarter)
Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6512

Wohnort: Hamburg

Ich habe mich jetzt für die "eingedanpfte" Variante von rklm entschieden. Finde ich sehr elegant. Und die erste Zeile habe ich auf /bin/sh geändert.

Ist man zu faul zu quoten ...

Ich bin zwar faul, deswegen ja das Script, aber so faul nun auch wieder nicht.

Antworten |