Вы можете использовать подмассив:
$ set -- arg1 arg2 arg3 arg4
$ str=${*:3}
$ echo "$str"
arg3 arg4
Чаще всего рекомендуется сохранять аргументы как отдельные элементы, что можно сделать с помощью $@
и назначением новогомассив:
$ arr=("${@:3}")
$ declare -p arr
declare -a arr=([0]="arg3" [1]="arg4")
Обратите внимание, что в str=${*:3}
цитирование не обязательно, но в arr=("${@:3}")
оно есть (или аргументы будут разделены пробелами).
Что касается вашего сообщения об ошибке: ваша команда
words= $(grep -v "$2"|"$3" $message)
делает следующее:
- Устанавливает переменную
words
в пустую строку для среды команды (потому что после =
) есть пробел. - Он пытается установить конвейер, состоящий из двух команд,
grep -v "$2"
и "$3" $message
.Первая из этих команд просто зависнет и будет ждать ввода;второй пытается запустить содержимое $3
как команду;предположительно, исходя из вашего сообщения об ошибке, $3
содержит First
. - Если конвейер действительно запустится, его вывод будет выполнен как команда (опять же из-за пробела справа от
=
).