Лучшая практика: печатать массив в bash-скрипте - PullRequest
0 голосов
/ 13 марта 2019

Я запустил shellcheck в своем скрипте и столкнулся с ошибкой в ​​очень простом аспекте -

эхо "Список удаленных полей: $ {удалено [@]}"
^ ----------- ^ SC2145: Аргумент смешивает строку и массив. Используйте * или отдельный аргумент.

Я пытаюсь сделать то же поведение, что и ниже-

declare -a  deleted
deleted = ("some.id.1" "some.id.22" "some.id.333")
echo "List of fields deleted: ${deleted[@]}"

Как лучше распечатывать элементы в массиве?

echo "List of fields deleted: ${deleted[@]}"

ИЛИ

echo "List of fields deleted: "
 for deletedField in "${deleted[@]}"; do echo "${deletedField}"; done

1 Ответ

2 голосов
/ 13 марта 2019

Включение индекса @ в длинную строку может привести к странным результатам:

$ arr=(a b c)
$ printf '%s\n' "Hi there ${arr[@]}"
Hi there a
b
c

Это происходит потому, что цитируемое расширение ${arr[@]} представляет собой серию отдельных слов, которые printf будут использовать по одному за раз. Первое слово a оканчивается на Hi there с добавленным к нему (так же, как все, что следует за массивом, будет добавлено к c).

Когда расширение массива является частью более крупной строки, вы почти наверняка захотите, чтобы расширение было одним словом.

$ printf '%s\n' "Hi there ${arr[*]}"
Hi there a b c

С echo это едва ли имеет значение, поскольку вам, вероятно, все равно, получает ли echo один или несколько аргументов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...