Есть контекст, который не ясен в вопросе, если вы не перейдете по ссылкам. Это касается следующей рекомендации от shellcheck.net :
local _help_text="${@:2}"
^––SC2124 Assigning an array to a string! Assign as array, or use * instead of @ to concatenate.
Краткий ответ: не назначайте списки вещей (например, аргументы) простым переменным, вместо этого используйте массив.
Длинный ответ: Как правило, "${@:2}"
получит все аргументы, кроме первого, каждый из которых будет рассматриваться как отдельный элемент («слово»). "${*:2}"
, с другой стороны, создает один элемент, состоящий из всех, кроме первого аргумента, слипшихся воедино, разделенных пробелом (или каким бы ни был первый символ $IFS
).
Но в конкретном случае, когда вы присваиваете простой переменной, переменная способна хранить только один элемент, поэтому var="${@:2}"
также сворачивает аргументы до одного элемента, но он делает это менее последовательно, чем "${*:2}"
. Чтобы избежать этого, используйте что-то, что способно хранить несколько элементов: массив. Итак:
- Действительно плохо:
var="${@:2}"
- Чуть менее плохо:
var="${*:2}"
- Гораздо лучше:
arrayvar=("${@:2}")
(скобки делают это массивом)
Примечание: чтобы вернуть элементы массива, каждый из которых обрабатывается как отдельный элемент, используйте "${arrayvar[@]}"
. Кроме того, массивы поддерживаются не всеми оболочками (в частности, dash
не поддерживает их), поэтому, если вы используете их, вы должны обязательно использовать bash shebang (#!/bin/bash
или #!/usr/bin/env bash
). Если вам действительно нужна переносимость к другим оболочкам, все становится намного сложнее