ShellCheck придирается к тому, что мое выражение не заключено в двойные кавычки, хотя это действительно так; Зачем?

Судя по вашему вопросу (, поскольку нет примеров ), я бы сказал, что ^@в большом файле на самом деле не два символа(^и @), а один из тех непечатаемых символов.

Вы можете ввести этот непечатаемый символ в терминал с помощью Ctrl + v+ Ctrl + 2.
Используйте это в sedвместо символов ^и @, и все должно быть в порядке.

Также удалите управляющую последовательность, поскольку она не нужна для непечатаемого символа.

9
19.03.2020, 00:02
2 ответа

Это ложное срабатывание, но это не то, что вы думаете. Это не имеет ничего общего с *и не указывало мне на него. Он расстроен тем, что `Name`находится внутри одинарных кавычек. Например, echo '`Name`'выдает такое же предупреждение, потому что думает, что вы хотите, чтобы обратные кавычки оценивались, поэтому предупреждает, что этого не будет.

12
28.04.2021, 23:20

Не ответ, а отформатированный комментарий:

Педантично, вы не должны использовать цикл for,но петля while read:

while IFS= read -r server; do
    : do stuff here
done < <(
    "$aws" ec2 describe-instances \
        --query 'Reservations[].Instances[][].{Name: Tags[?Key==`Name`].Value[] | [0]}' \
        --filters "Name=tag:Name,Values=${server_name}*" \
        --output text
)

forциклов чтения пробелов -разделенных слов , whileциклов чтения строк--см.http://mywiki.wooledge.org/BashFAQ/001

В качестве альтернативы используйте readarrayдля захвата вывода

readaray -t servers < <(
    "$aws" ec2 describe-instances \
        --query 'Reservations[].Instances[][].{Name: Tags[?Key==`Name`].Value[] | [0]}' \
        --filters "Name=tag:Name,Values=${server_name}*" \
        --output text
)

for server in "${servers}"; do...; done

Наконец, для длинных и нечитаемых команд сохранение параметров в массиве может улучшить читаемость:

opts=(
    --query 'Reservations[].Instances[][].{Name: Tags[?Key==`Name`].Value[] | [0]}' 
    --filters "Name=tag:Name,Values=${server_name}*"
    --output text
)

readarray -t servers < <("$aws" ec2 describe-instances "${opts[@]}")
3
28.04.2021, 23:20

Теги

Похожие вопросы