Ви можете використовувати 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, вам потрібно змінити це або використовувати підхід Розширення параметрів.