Ответы:
ARGS="-a -b -c"
grep -- "$ARGS"
grep -- "--name awesome"
.
Тире - это специальный символ в Bash, как отмечено на http://tldp.org/LDP/abs/html/special-chars.html#DASHREF . Так что избежание этого однажды приведет вас к Bash, но Grep все еще имеет свое значение для штрихов (предоставляя опции).
Так что вам действительно нужно дважды избежать этого (если вы предпочитаете не использовать другие упомянутые ответы). Следующее будет / должно работать
grep \\-X
grep '\-X'
grep "\-X"
Один из способов проверить, как Bash передает аргументы скрипту / программе, - это создать скрипт .sh, который просто повторяет все аргументы. Я использую скрипт с именем echo-args.sh, чтобы время от времени играть с ним:
echo $*
Я призываю это как:
bash echo-args.sh \-X
bash echo-args.sh \\-X
bash echo-args.sh "\-X"
Вы поняли идею.
grep -e -X
сделает свое дело.
-P
(но это другая история и здесь не применимо)).
grep -- -X
grep \\-X
grep '\-X'
grep "\-X"
grep -e -X
grep [-]X
Правильный способ будет использовать «-», чтобы остановить обработку аргументов, как уже упоминалось. Это связано с использованием getopt_long (GNU C-функция из getopt.h) в источнике инструмента.
Вот почему вы замечаете те же явления на других инструментах командной строки; Поскольку большинство из них являются инструментами GNU и используют этот вызов, они демонстрируют то же поведение.
В качестве примечания: getopt_long - это то, что дает нам отличный выбор между -rlo и --really_long_option и комбинацией аргументов в интерпретаторе.
Если вы используете другую утилиту, которая передает один аргумент в grep, вы можете использовать:
'[-]X'
Вы можете использовать Nawk
$ nawk '/-X/{print}' file
ls -l | grep "^-"
Надеюсь, что это послужит вашей цели.
grep "^ -X" файл
Он будет grep и выберет все строки из файла. ^ в grep «^» обозначает строку, начинающуюся с
-
строк, а не строк.
--
означает или делает: unix.stackexchange.com/questions/11376/…