if ((BASH_VERSINFO[0] -eq 4))
Die bash macht Unterschiede in den Vergleichen:
- Code: Select all
if [ ... ]; then
if [[ ... ]]; then
if (( ... )); then
Einfache und doppelte eckige Klammern funktionieren ähnlich und werden vor allem für Textvergleiche genutzt.
Der eingebaute Befehl "[" funktioniert dabei genauso wie der externe Befehl "/bin/[" oder "/bin/test". Eingebaute Befehle sind nur etwas schneller.
Die doppelten eckigen Klammern "[[" gelten als ein "reserviertes Schlüsselwort". Das hat Auswirkungen auf die Fehlerbehandlung und das Word Splitting an Leerzeichen.
Die doppelten runden Klammern "((" werden für
arithmetische Ausdrücke und Vergleiche verwendet, und man kann (
und muss) darin normale mathematische Operatoren verwenden:
- Code: Select all
if ((BASH_VERSINFO[0] == 4))
Referenz:
https://www.gnu.org/software/bash/manual/html_node/Shell-Arithmetic.htmlDer Operator
-eq verursacht in diesem Kontext nur einen Fehler und einen Abbruch des Skripts:
- Code: Select all
$ ./update-generator.bash
Info: Starting update-generator.bash 1.22-ESR (2022-01-30)
Info: Command line: ./update-generator.bash
Info: Running on WSUS Offline Update, Community Edition 11.9.12
(b74)
Info: CreationDate of the update catalog file:
2022-10-11T01:11:14Z
Info: Repository last updated on 2022-11-05
Info: Checking needed applications...
./common-tasks/30-check-needed-applications.bash: line 100: eq: unbound variable
Keeping temporary files for debugging...
Exiting update-generator.bash (error code 1)...
Die Meldung "unbound variable" bedeutet, dass eq nun als ein Variablenname interpretiert wurde, der ganze Operator -eq also als "minus eq".
Das Skript
syntax-check.bash wurde speziell dazu entwickelt, die Syntax aller Skripte im Ordner wsusoffline/sh zu überprüfen. Es macht einen kurzen Test mit der bash selber und dann einen gründlichen Test mit shellcheck:
- Code: Select all
$ ./syntax-check.bash
Syntax check with bash...
Syntax check with shellcheck...
./30-check-needed-applications.bash:100:8: error: Shells disambiguate (( differently or not at all. For subshell, add spaces around ( . For ((, fix parsing errors. [SC1105]
./30-check-needed-applications.bash:100:9: warning: (..) is a subshell. Did you mean [ .. ], a test expression? [SC2205]
./30-check-needed-applications.bash:100:11: warning: This is a glob used as a command name. Was it supposed to be in ${..}, array, or is it missing quoting? [SC2211]
./30-check-needed-applications.bash:100:28: error: In arithmetic contexts, use == instead of -eq [SC1106]
Referenz:
https://www.shellcheck.net/Viele Grüße,
Hartmut