Как часть этого скрипта, я должен быть в состоянии проверить, соответствует ли первый аргумент первого слова файла. Если это так, выйдите с сообщением об ошибке; если это не так, добавьте аргументы в файл. Я понимаю, как написать if
заявление, но не как использовать grep
в сценарии. Я понимаю, что grep
будет выглядеть примерно так
grep ^$1 schemas.txt
Я чувствую, что это должно быть намного легче, чем я делаю это.
Я получаю сообщение об ошибке «слишком много аргументов» if
. Я избавился от пробела между ними, grep -q
а затем получил ошибку двоичного оператора.
if [ grep -q ^$1 schemas.txt ]
then
echo "Schema already exists. Please try again"
exit 1
else
echo "$@" >> schemas.txt
fi
[
...]
и это сработает. Хотя вы, вероятно, хотите процитировать свою модель:if grep -q "^$1" schemas.txt; then …
Ответы:
grep
возвращает другой код завершения, если он обнаружил что-то (ноль) и если он ничего не нашел (не ноль). Вif
операторе нулевой код выхода отображается на «истина», а ненулевой код выхода отображается на ложь. Кроме того, у grep есть-q
аргумент, чтобы не выводить сопоставленный текст (а только возвращать код состояния выхода)Итак, вы можете использовать grep следующим образом:
В качестве краткого примечания, когда вы делаете что-то подобное
if [ -z "$var" ]…
, оказывается, что[
на самом деле вы запускаете команду, например, grep. В моей системе это так/usr/bin/[
. (Технически, ваша оболочка, вероятно, имеет встроенную функцию, но это оптимизация. Она ведет себя так, как если бы она была командой). Он работает так же,[
возвращает нулевой код выхода для true, ненулевой код выхода для false. (test
то же самое, что[
и за исключением закрытия]
)источник
ls -l /usr/bin/\[
иman [
увидите, что[
эта программа, как и любая другая, просто выглядит как синтаксический элемент - это должно сделать ее более понятной и понятной. (для удобства[
также есть встроенные в bash, dash и другие - но это все-таки команда). также попробуйтеtype -all [
в bash.-q
опцию, которая говорит, что grep будет тихим (не печатать совпавшие строки).Другим простым способом является использование
grep -c
.Выводит (не возвращает в качестве кода выхода) количество строк, соответствующих шаблону, поэтому 0, если совпадения нет, или 1 или более, если совпадение.
Итак, если вы хотите проверить, что шаблон соответствует 3 или более раз, вы должны сделать:
источник
grep -cim1
вместо этого.Я знаю, что опоздал на это, но мне нравится эта короткая версия:
источник
Если мы хотим поймать первое слово файла, нам нужно добавить add
-zw
в grepБез
-z
мы получаем первое слово строки. Без-w
мы получим частичные слова.источник
Если вы хотите использовать его в квадратных скобках, вы можете выполнить ниже
Эта логика работает для всех команд, просто поместите ваши команды в кавычки (кнопка над вкладкой или внизу кнопки Esc или слева от кнопки 1)
источник
`grep -q PATTERN file.txt`
, в противном случае применяется оператор split + glob, что может вызвать проблемы для любого вывода, содержащего символы$IFS
или символы подстановки. В более общем случае,[ "`cmd`" ]
возвращает значение true, еслиcmd
выводит по крайней мере одну непустую строку на стандартный вывод (с потенциальными проблемами, если выводит байты NUL). Это означает, что оболочка должна будет хранить весь вывод в памяти и ждать его завершения. Использованиеif cmd | grep -q .
вместо этого может быть предпочтительным в этом отношении.-q
переключателя - подавитьgrep
выходной сигнал. Вы говорите: проверьте наличие PATTERN в файле file.txt, отключите все выходные данные, затем установите статус возврата в соответствии с тем, был ли найден PATTERN. Затем проигнорируйте возвращаемый статус, возьмите выходные данные команды (которые мы вынудили оставить пустыми), примените разделение слов и расширение глобуса файла (не приводя ни к каким аргументам вообще), затем выполните команду[
(akatest
) с ровно одним аргументом, а именно ,]
-, а затем, поскольку это приведет к ошибке, эхо "не найден". @ StéphaneChazelas, я что-то пропустил?-q
. Этот комментарий имел бы смысл[ `grep PATTERN file.txt ` ]
, но, как намекает в комментарии,[ "`grep -n PATTERN file.txt`" ]
было бы лучше, если бы PATTERN мог соответствовать только пустым строкам. Хотя здесь, конечно, этоif grep -q PATTERN file.txt
вы хотите.