Можно сохранить соответствие списку файлов и grep только при соответствии файлам. Это будет намного быстрее. Например, можно использовать find
+ grep
:
find . -type f -exec grep -l 'PATTERN' {} \+ | xargs grep -H -C 3 'PATTERN'
Если необходимо видеть grep
вывод после первого показа в find
это немного более твердо, но все еще довольно легко. Вы просто должны использовать что-то как этот
find -exec grep -H 'PATTERN' {} \+ | tee -a out.log |\
sed 's/^[^:]*://' | sort -u | xargs grep -C 3 'PATTERN'
И вывод будет сохранен в файл out.log.
Одно обходное решение было бы:
... -o "x--no-create-db --replace"
# in the script:
option="${option#x}"
Как правило: необходимо заключить все в кавычки (который может быть заключен в кавычки).
Если указать, что --
отмечает конец опций и все последующие аргументы будут переданы в подкоманду, то можно сделать что-то подобное, что можно найти в man getopts
:
aflag=
bflag=
while getopts ab: name
do
case $name in
a) aflag=1;;
b) bflag=1
bval="$OPTARG";;
?) printf "Usage: %s: [-a] [-b value] args\n" $0
exit 2;;
esac
done
if [ ! -z "$aflag" ]; then
printf "Option -a specified\n"
fi
if [ ! -z "$bflag" ]; then
printf 'Option -b "%s" specified\n' "$bval"
fi
shift $(($OPTIND - 1))
printf "Remaining arguments are: %s\n$*"
Конкретно я имею в виду самый конец - getopts
останавливает обработку опций при столкновении с --
, поэтому все эти аргументы останутся в $@
. В примере выше все аргументы getopts
обрабатываются следующим образом: сдвиг
ed, а остальные распечатываются сразу как $*
. При аналогичной обработке можно выполнить следующую работу:
/mysqldumpwrapper.sh \
-u username \
-p password \
-h localhost \
-- \
-now --all of these --are passed through
И вызвать обёрнутое приложение:
mysqldump "$@" \
--host=$MYSQL_HOST \
--user=$MYSQL_USER \
--password=$MYSQL_PASS "$DB" \
> "$FILE_DEST"