Как создать строку = $ * без аргументов $ 1 и $ 2 - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть скрипт, который принимает несколько аргументов.

Мне нужно все, кроме $1 и $2 в строке.

Я пробовал это:

message="$*"
words= $(grep -v "$2"|"$3" $message)

но не работает, выдает ошибку:

. / Backup: строка 26: Первая: команда не найдена

Ответы [ 3 ]

2 голосов
/ 26 сентября 2019

Используйте shift 2, чтобы сдвинуть аргументы (это отбрасывает первые n аргументы).Если вам понадобятся "$1" и "$2" для дальнейшего использования, сначала сохраните их в переменных.

Обратите внимание, что в оболочке присваивания переменным не могут иметь пробелов по обе стороны от =.

First=$1
Second=$2
shift 2
Message=$@
0 голосов
/ 26 сентября 2019

Может как то так?

[root@tsekmanrhel771 ~]# cat ./skip1st2.sh
#!/bin/bash

COUNT=0

for ARG in "$@"
do
    COUNT=$[COUNT + 1]

    if [ ${COUNT} -gt 2 ]; then
        RESULT="${RESULT} ${ARG}"
    fi
done

echo ${RESULT}

[root@tsekmanrhel771 ~]# ./skip1st2.sh first second third 4 5 6 7
third 4 5 6 7
0 голосов
/ 26 сентября 2019

Вы можете использовать подмассив:

$ 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.
  • Если конвейер действительно запустится, его вывод будет выполнен как команда (опять же из-за пробела справа от =).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...