Допустим, вы пишете сценарий оболочки. Он принимает произвольное количество аргументов командной строки и передает их утилите командной строки. При вызове этой утилиты каждый аргумент должен начинаться с флага. Как правильно избежать этого в вашем скрипте, чтобы утилита видела те же строки, что и скрипт оболочки?

Конкретный пример: передача регулярных выражений в grep . Вы запускаете свой скрипт оболочки:

./findit.sh needle "old socks" "spare change"

И вы ожидаете, что grep будет вызываться с этими аргументами в качестве выражений соответствия:

grep haystack.txt -e needle -e "old socks" -e "spare change"

Это префикс -e который усложняет ситуацию; если в этом нет необходимости, вы можете просто использовать "$@" . Что нужно сделать вашему скрипту, чтобы убедиться, что grep правильно экранирует аргументы? Есть ли портативный способ сделать это?

1 ответ1

0

У меня есть рабочая версия в Bash, но она использует массивы Bash, и я сильно подозреваю, что она не переносимая:

for arg in "$@"; do
  args+=("-e" "$arg")
done

grep haystack.txt "${args[@]}"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .