Удаление финала колотит аргумент сценария

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

#!/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}"
7
задан ctuffli 16 March 2010 в 22:59
поделиться

1 ответ

РЕДАКТИРОВАТЬ:

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

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

find "$path" -print0 | xargs -0 grep "${@:1:$(($#-remove))}"
8
ответ дан 7 December 2019 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: