Bash Shellcheck Problem mit Variablen in Klammererweiterung

7

Ich versuche, ein Array von Dateinamen zu erstellen, das auf zwei Variablen basiert und die Klammererweiterung wie folgt verwendet:

#!/bin/bash
altdir=/usr
arg=abc
tries=({.,$altdir}/{$arg,$arg/main}.{tex,ltx,drv,dtx})
for i in "${tries[@]}"; do echo $i; done

In der letzten Anweisung werden die gewünschten Dateien korrekt aufgelistet:

./abc.tex
./abc.ltx
./abc.drv
./abc.dtx
./abc/main.tex
./abc/main.ltx
./abc/main.drv
./abc/main.dtx
/usr/abc.tex
/usr/abc.ltx
/usr/abc.drv
/usr/abc.dtx
/usr/abc/main.tex
/usr/abc/main.ltx
/usr/abc/main.drv
/usr/abc/main.dtx

Aber Shellcheck sagt mir, dass die beiden Variablen altdir und arg nicht verwendet zu werden scheinen:

$ shellcheck testscript

In testscript line 3:
    altdir=/usr
    ^-- SC2034: altdir appears unused. Verify it or export it.

In testscript line 4:
    arg=abc
    ^-- SC2034: arg appears unused. Verify it or export it.

Gibt es einen besseren Weg, dies zu tun?

Wybo Dekker
quelle
2
Es scheint ein Shellcheck-Bug zu sein. Sie scheinen eine variable Verwendung bei der Klammererweiterung nicht zu erkennen.
Choroba
Ich denke dir geht es gut. Eine nicht verwendete Variablenwarnung soll Tippfehler abfangen. Wenn Sie wissen, dass Sie keinen Fehler machen, können Sie ihn ignorieren.
Tom Hunt
Der Commit-Verlauf von @WyboDekker shellcheck legt nahe, dass dies in 0.3.8 behoben wurde. Ihre Version 0.3.4 ist über ein Jahr alt.
andere Typ

Antworten:

5

Eine Problemumgehung kann sein:

#!/bin/bash

unset altdir
unset arg

: "${altdir:=/usr}"
: "${arg:=abc}"

tries=({.,"$altdir"}/{"$arg","$arg"/main}.{tex,ltx,drv,dtx})
for i in "${tries[@]}"; do echo "$i"; done

oder machen Sie shellcheckIgnoriercode SC2034:

shellcheck -e SC2034 testscript

(Und denken Sie daran, Ihre Variablen immer in Anführungszeichen zu setzen, wenn Sie keinen Listenkontext wünschen.)

cuonglm
quelle
Vielen Dank! Immerhin habe ich festgestellt, dass sich die Online-Version von Shellcheck anders verhält als meine Debian-8.1-Version (Shellcheck-0.3.4). Die Online-Version hatte kein Problem mit meinem ursprünglichen Skript, mit Ausnahme des $ i, das in Anführungszeichen gesetzt werden sollte. Der Debian-Shellcheck sagte über die zitierte try = -Anweisung: "Verwenden Sie Leerzeichen, keine Kommas, um Array-Elemente zu trennen. [SC2054]", weshalb ich die Anführungszeichen entfernt habe.
Wybo Dekker