bash shellcheck vấn đề với các biến trong mở rộng cú đúp


7

Tôi đang cố gắng tạo một mảng các tên tệp, dựa trên hai biến và sử dụng mở rộng dấu ngoặc, như sau:

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

Câu lệnh cuối cùng liệt kê các tệp tôi muốn chính xác:

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

Nhưng shellcheck cho tôi biết rằng hai biến, altdir và arg, dường như không được sử dụng:

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

Có cách nào tốt hơn để làm điều này?


2
Có vẻ như là một lỗi của shellcheck. Họ dường như không nhận ra một cách sử dụng khác nhau trong việc mở rộng cú đúp.
choroba

Tôi nghĩ bạn ổn. Một cảnh báo biến không được sử dụng có nghĩa là để bắt lỗi chính tả; nếu bạn biết bạn không phạm sai lầm, có thể bỏ qua nó.
Tom Hunt

Lịch sử cam kết của @WyboDekker shellcheck cho thấy điều này đã được sửa trong 0.3.8. Phiên bản 0.3.4 của bạn đã hơn một năm tuổi.
anh chàng kia

Câu trả lời:


5

Một cách giải quyết có thể là:

#!/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

hoặc shellcheckbỏ qua SC2034mã:

shellcheck -e SC2034 testscript

(Và nhớ luôn luôn trích dẫn các biến của bạn nếu bạn không muốn liệt kê bối cảnh)


Cảm ơn! Sau tất cả, tôi thấy rằng phiên bản shellcheck trực tuyến hoạt động khác với phiên bản Debian-8.1 của tôi (shellcheck-0.3.4). Phiên bản trực tuyến không có vấn đề gì với tập lệnh gốc của tôi, ngoại trừ $ i nên được trích dẫn. Trình kiểm tra shell Debian đã nói về câu lệnh try = trích dẫn: "Sử dụng dấu cách, không phải dấu phẩy, để tách các thành phần mảng. [SC2054]", đó là lý do tại sao tôi xóa dấu ngoặc kép.
Wybo Dekker
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.