bash shellcheck 问题与括号扩展中的变量

Wyb*_*ker 7 shell bash brace-expansion shellcheck

我正在尝试基于两个变量并使用大括号扩展创建一个文件名数组,如下所示:

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

最后一条语句正确列出了我想要的文件:

./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
Run Code Online (Sandbox Code Playgroud)

但是 shellcheck 告诉我,altdir 和 arg 这两个变量似乎未使用:

$ 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.
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?

cuo*_*glm 5

解决方法可以是:

#!/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
Run Code Online (Sandbox Code Playgroud)

或制作shellcheck忽略SC2034代码:

shellcheck -e SC2034 testscript
Run Code Online (Sandbox Code Playgroud)

(如果您不想要列表上下文,请记住始终引用您的变量