Відповіді:
ARGS="-a -b -c"
grep -- "$ARGS"
grep -- "--name awesome"
.
Тире - це особливий символ у Bash, як зазначено на http://tldp.org/LDP/abs/html/special-chars.html#DASHREF . Тож уникнення цього разу просто переходить вас через Баша, але Греп все ще має власне значення для тире (надаючи варіанти).
Тож вам справді потрібно уникнути цього двічі (якщо ви віддаєте перевагу не використовувати інші згадані відповіді). Наступні будуть / повинні працювати
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 та комбінацією аргументів в інтерпретаторі.
ls -l | grep "^-"
Сподіваюся, що ця послужила б вашим цілям.
grep-файл "^ -X"
Він зігріє і вибере всі рядки з файлу. ^ у грепі "^" вказується рядок, що починається з
-
, а не рядків.
--
означає чи робить: unix.stackexchange.com/questions/11376/…