Как я воспринимаю ввод оболочки буквально? (т. е. сохранение кавычек и т. д. без изменений)

Я пытаюсь написать сценарий bash, который я буду использовать для замены моей команды egrep. Я хочу иметь возможность получать те же данные, что и мой скрипт, и передавать их в egrep. то есть

#!/bin/bash
PARAMS=$@
`egrep "$PARAMS"`

Но я заметил, что если я повторяю то, что я выполняю, кавычки удаляются следующим образом:

./customEgrep -nr "grep my ish" *

возвращается

egrep -nr grep my ish (список файлов из расширенного *)

Есть ли способ, которым я могу воспринимать ввод буквально, чтобы использовать его напрямую с egrep?


person TopGunCoder    schedule 26.01.2013    source источник
comment
Обратите внимание, что нет необходимости помещать команду egrep в обратные кавычки в вашем скрипте. Вы не пытаетесь зафиксировать его вывод; вы просто хотите, чтобы он пошел на стандартный вывод.   -  person chepner    schedule 26.01.2013


Ответы (3)


Вы хотите это:

egrep "$@"

Вводимые вами кавычки не передаются сценарию; они используются для определения границ слов. Использование "$@" сохраняет эти границы слов, поэтому egrep получит те же аргументы, что и при непосредственном запуске. Но вы все равно не увидите кавычки, если вы echo аргументы.

person Mark Reed    schedule 26.01.2013

" — это специальный символ. вам нужно использовать escape-символ, чтобы получить "

использовать

./customEgrep -nr "\"grep my ish\"" *

Если вам не нужно делать какое-либо расширение параметра в аргументе, вы можете использовать одинарные кавычки, чтобы избежать необходимости экранировать двойные кавычки:

./customerEgrep -nr '"grep my ish"' *
person Can Geliş    schedule 26.01.2013

$@ выделяется в кавычках. Пытаться:

value=$( egrep "$@" )

Мне не ясно, почему вы используете обратную политику и игнорируете результат, поэтому я использовал синтаксис $() и присвоил значение.

Если по какой-то причине вы хотите сохранить параметры для последующего использования, вы также можете сделать следующее:

for i; do args="$args '$i'"; done  # Save the arguments
eval grep $args # Pass the arguments to grep without resetting $1,$2,...
eval set $args  # Restore the arguments
grep "$@"       # Use the restored arguments
person William Pursell    schedule 26.01.2013