Вы можете использовать bash
расширение параметров, чтобы указать диапазон, это также работает с позиционными параметрами. Для $3
... $n
это будет:
"${@:3}" # expands to "$3" "$4" "$5" …
"${*:3}" # expands to "$3 $4 $5 …"
Имейте в виду, что оба $@
и $*
игнорируйте первый аргумент $0
. Если вам интересно, какой из них использовать в вашем случае: очень вероятно, что вы хотите цитаты $@
. Не используйте, $*
если вы явно не хотите, чтобы аргументы цитировались индивидуально.
Вы можете попробовать это следующим образом:
$ bash -c 'echo "${@:3}"' 0 1 2 3 4 5 6
3 4 5 6
$ echo 'echo "${@:3}"' >script_file
$ bash script_file 0 1 2 3 4 5 6
2 3 4 5 6
Обратите внимание, что в первом примере $0
заполняется первый аргумент, 0
а при использовании в скрипте $0
вместо этого заполняется именем скрипта, как показано во втором примере. Имя сценария, bash
конечно же, является первым аргументом, просто он обычно не воспринимается как таковой - то же самое относится и к сценарию, который исполняется и называется «напрямую». Итак, в первом примере мы имеем $0
= 0
, $1
= 1
и т. Д., А во втором это $0
= script_file
, $1
= 0
, $2
= и 1
т. Д .; ${@:3}
выбирает каждый аргумент, начинающийся с $3
.
Некоторые дополнительные примеры для возможных диапазонов:
# two arguments starting with the third
$ bash -c 'echo "${@:3:2}"' 0 1 2 3 4 5 6
3 4
# every argument starting with the second to last one
# a negative value needs either a preceding space or parentheses
$ bash -c 'echo "${@: -2}"' 0 1 2 3 4 5 6
5 6
# two arguments starting with the fifth to last one
$ bash -c 'echo "${@:(-5):2}"' 0 1 2 3 4 5 6
2 3
Дальнейшее чтение:
shift
подход сделает невозможным доступ,$1
и$2
после того, как вы их изменили. В вашем сценарии, который вы используете$2
вместе с$variable_in_question
, вам нужно либо изменить это, либо использовать подход расширения параметров.shift
хорошо, когда первые один или несколько аргументов являются особыми, и имеет смысл выделить их в отдельные переменные (foo="$1"; bar="$2";
илиif [[ something with $1 ]];then blah blah; shift
. Но ответ @sert с неразрушающим подходом хорош в других случаях, когда вам все еще нужен полный список позже или при использовании любителя синтаксис , чтобы выбрать ограниченный диапазон аргументов, а не до бесконечности, без введения пустой арг в команду , если$@
не имеет , что многие элементов.Как правило, вы можете скопировать позиционные параметры в массив, удалить произвольные индексы массива, а затем использовать массив для расширения до точно тех индексов, которые вам нужны, без потери исходных аргументов.
Например, если мне нужны все аргументы, кроме первого, четвертого и пятого:
В копии индексы смещены на 1, поскольку
$0
не являются частью$@
.источник
echo "${args[@]:2}"
для третьего до последнего аргумента.