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?


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.)


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.