staging.inyokaproject.org

bash-Script: Variablen vor Zuweisung deklarieren

Status: Gelöst | Ubuntu-Version: Ubuntu 18.04 (Bionic Beaver)
Antworten |

frechdachs

Anmeldungsdatum:
3. Juni 2013

Beiträge: 120

Hallo zusammen,

gerade bei umfangreichen bash-Scripten stoße ich immer wieder auf das Problem, dass in dem Script "Buchstabendreher" enthalten sind. Speziell bei Variablen kann das äußerst unschöne Auswirkungen haben:

1
2
3
4
verz="/srv/files/frechdachs"

# Achtung: Buchstabendreher!
find $vezr -type f -mtime +30 -not -name "README.txt" -delete

Eigentlich war das Ziel, alle Dateien im Verzeichnis /srv/files/frechdachs zu löschen, die älter sind als 30 Tage. Durch den Buchstabendreher werden nun Dateien in einem anderen Verzeichnis gelöscht...

In einigen Programmiersprachen gibt es die Vorgabe, dass Variablen erst deklariert werden müssen.

Deshalb meine Frage: Kann man dies auch in einem bash-Script umsetzen?

Vielen Dank und liebe Grüße,

frechdachs

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Ja, dafür gibt es set -u: https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html#The-Set-Builtin

-u

Treat unset variables and parameters other than the special parameters ‘@’ or ‘*’ as an error when performing parameter expansion. An error message will be written to the standard error, and a non-interactive shell will exit.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Es gibt Texteditoren, die einem bekannte Wörter im Buffer als Vervollständigungshilfe anbieten - bei vim geht das z.B. mit STRG + n im Eingabemodus, während der Cursor frei oder am Ende eines teilweise getippten Wortes steht, das schon mal vorkam.

frechdachs

(Themenstarter)

Anmeldungsdatum:
3. Juni 2013

Beiträge: 120

Hallo seahawk1986,

vielen Dank für Deine schnelle Antwort.

Klasse - diese Möglichkeit war mir nicht bekannt.

Herzlichen Dank und liebe Grüße,

frechdachs

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

In diesem Fall hätte auch gewöhnliches Quoting den Fehler gefunden:

1
2
3
$ unset vezr
$ find "$vezr" -type f -mtime +30 -not -name "README.txt" -delete
find: ‘’: No such file or directory

Oft ist es auch sinnvoll, ein Skript mit set -x auszuführen. Dann sieht man die Werte. Ich habe oft dies in meinem Skript:

1
2
3
4
5
#!/bin/sh

test -z "$DEBUG" || set -x

...

Dann kann ich das Debuggen über die Umgebung steuern:

1
$ DEBUG=x mein-script

oder auch

1
2
$ export DEBUG=x
$ mein-script

frechdachs

(Themenstarter)

Anmeldungsdatum:
3. Juni 2013

Beiträge: 120

Hallo rklm,

1
2
$ export DEBUG=x
$ mein-script

Diesen Vorschlag werde ich ab sofort übernehmen!

Coole Idee...

Liebe Grüße,

Frechdachs

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Mit Shellcheck findest Du solche Fehler - einfach jedes neue Script durch Shellcheck jagen - gibt es online und zur Installation, wenn Du mehr als 2 Scripte pro Jahr schreibst:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
shellcheck buchstabendrehertest.sh 

In buchstabendrehertest.sh line 2:
verz="/srv/files/frechdachs"
^-- SC2034: verz appears unused. Verify it or export it.


In buchstabendrehertest.sh line 5:
find $vezr -type f -mtime +30 -not -name "README.txt" -delete
     ^-- SC2154: vezr is referenced but not assigned.
     ^-- SC2086: Double quote to prevent globbing and word splitting.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

user_unknown schrieb:

1
     ^-- SC2086: Double quote to prevent globbing and word splitting.

Nasowas! Das von Dir? 😉

frechdachs

(Themenstarter)

Anmeldungsdatum:
3. Juni 2013

Beiträge: 120

user_unknown schrieb:

Mit Shellcheck findest Du solche Fehler - einfach jedes neue Script durch Shellcheck jagen - gibt es online und zur Installation, wenn Du mehr als 2 Scripte pro Jahr schreibst:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
shellcheck buchstabendrehertest.sh 

In buchstabendrehertest.sh line 2:
verz="/srv/files/frechdachs"
^-- SC2034: verz appears unused. Verify it or export it.


In buchstabendrehertest.sh line 5:
find $vezr -type f -mtime +30 -not -name "README.txt" -delete
     ^-- SC2154: vezr is referenced but not assigned.
     ^-- SC2086: Double quote to prevent globbing and word splitting.

Das ist auch pfiffig. Interessantes Tool. Danke für den Tipp.

Liebe Grüße,

Frechdachs

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

rklm schrieb:

user_unknown schrieb:

1
     ^-- SC2086: Double quote to prevent globbing and word splitting.

Nasowas! Das von Dir? 😉

Das sagt das Tool - man darf keinesfaslls das, was das Tool sagt, unkritisch für bare Münze nehmen - dann wird das Tool zum Fetisch, die den Zwangscharacter aka Neurotiker fütttert.

Aber als Anregung um ein zweites Mal (oder vielleicht erstes Mal) nachzudenken ist es ausgezeichnet.

Antworten |