Удаление окончательного аргумента сценария bash - PullRequest
7 голосов
/ 17 марта 2010

Я пытаюсь написать скрипт, который ищет в каталоге файлы и greps для шаблона. Что-то похожее на приведенное ниже , за исключением , выражение find гораздо сложнее (исключая отдельные каталоги и файлы).

#!/bin/bash
if [ -d "${!#}" ]
then
    path=${!#}
else
    path="."
fi

find $path -print0 | xargs -0 grep "$@"

Очевидно, что вышеприведенное не работает, потому что "$@" по-прежнему содержит путь. Я пробовал варианты построения списка аргументов путем перебора всех аргументов для исключения пути, таких как

args=${@%$path}
find $path -print0 | xargs -0 grep "$path"

или

whitespace="[[:space:]]"
args=""
for i in "${@%$path}"
do
    # handle the NULL case
    if [ ! "$i" ]
    then
        continue
    # quote any arguments containing white-space
    elif [[ $i =~ $whitespace ]]
    then
        args="$args \"$i\""
    else
        args="$args $i"
    fi
done

find $path -print0 | xargs -0 grep --color "$args"

но это не с кавычками. Например,

# ./find.sh -i "some quoted string"
grep: quoted: No such file or directory
grep: string: No such file or directory

Обратите внимание, что если $@ не содержит путь, первый скрипт делает то, что я хочу.


РЕДАКТИРОВАТЬ : Спасибо за отличные решения! Я пошел с комбинацией ответов:

#!/bin/bash

path="."
end=$#

if [ -d "${!#}" ]
then
    path="${!#}"
    end=$((end - 1))
fi

find "$path" -print0 | xargs -0 grep "${@:1:$end}"

1 Ответ

8 голосов
/ 17 марта 2010

EDIT:

Оригинал был чуть-чуть выключен. Удаление не должно выполняться, если последний аргумент не является каталогом.

#!/bin/bash
if [ -d "${!#}" ]
then
    path="${!#}"
    remove=1
else
    path="."
    remove=0
fi

find "$path" -print0 | xargs -0 grep "${@:1:$(($#-remove))}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...