Использование grep внутри скрипта

Я пытаюсь найти файл, чтобы найти слово, используя grep. Я пытаюсь использовать его внутри скрипта, но не могу заставить его работать. Я новичок в этом, поэтому мой код, вероятно, не очень хорош. Вот что у меня есть до сих пор

#!/bin/bash
echo "apple", "book", "cat" >> file.txt

read -r filename
filename='file.txt'
"$4"=filename
"$1"=grep
"$2"=-R

Поэтому в идеале я хочу, чтобы пользователь мог ввести имя сценария в командной строке вместе со словом, которое он ищет, в данном случае это будет «книга».

user:~/dir$ ./wordfind.sh book

Возможно, я делаю это совершенно неправильно, но когда я запускаю вышеописанное в командной строке, оно зависает, и мне приходится нажимать Ctrl-Z, чтобы выйти из него. Спасибо.

если вы проверяете регулярное выражение, где это регулярное выражение?

Aalexander 11.12.2020 20:29

если вы собираетесь хардкодить filename='file.txt', то зачем запрашивать у пользователя имя файла (read -r filename)? Кстати, сценарий, вероятно, «зависает», потому что он ждет, пока вы введете имя файла (т. е. read -r filename говорит сценарию ждать, пока пользователь что-то введет и нажмет <enter>); также не уверен, чего вы пытаетесь достичь с помощью конструкций "${4|1|2}"=...., и как любой из них должен запускать команду grep; возможно, вы хотите что-то столь же простое, как grep "${1:-undefined}" "${filename}"?

markp-fuso 11.12.2020 20:39

Привет и добро пожаловать! Каков ожидаемый результат?

user14757127 11.12.2020 20:52

@Madman Я пытаюсь заставить его найти слово «рис» в файле .txt. $1, $2 и т. д. находятся в скрипте, поэтому вам не нужно вводить всю команду в командной строке. Вместо того, чтобы набирать ./wordfind.sh grep -Rris file.txt , я хочу просто ввести ./wordfindris , и он найдет слово рис. Надеюсь это имеет смысл.

user13784532 11.12.2020 20:56

Также (повторно) использовать позиционные переменные в присваиваниях - плохая идея; в вашем случае "$1"=grep перезапишет все, что пользователь передал в командной строке.

tink 11.12.2020 21:16

@Andrew Пожалуйста, отредактируйте свой вопрос и добавьте туда запрошенную информацию или разъяснения вместо того, чтобы отвечать в комментариях. Покажите ожидаемый результат для вашего примера использования ./wordfind rice. Цитаты в ваших строках echo "apple", "book", "cat" >> file.txt и т. д. странные. Используя echo "apple, book, cat" >> file.txt или echo apple, book, cat >> file.txt, вы получите тот же результат, что и линия apple, book, cat. При повторном запуске скрипта без удаления file.txt вы снова добавите те же строки в файл. Это то, чего ты хочешь?

Bodo 11.12.2020 21:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
294
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вопрос недостаточно ясен.

Этот ответ предполагает, что вы хотите вызвать свой скрипт со строкой или регулярным выражением в качестве первого аргумента, т. е. условие поиска должно быть заключено в кавычки, если оно содержит пробелы или специальные символы.

Вы можете изменить сценарий wordfind.sh на

#!/bin/bash

# note: I changed >> to > here to avoid duplicating the data on repeated calls
echo "apple", "book", "cat" > file.txt
echo "dad", "food", "girl" >> file.txt
echo "god", "hey", "linux" >> file.txt
echo "out", "owl", "rice" >> file.txt
echo "say", "toy", "zebra" >> file.txt

# Check if exactly one argument was specified.
if [ $# -ne 1 ]
then
   echo "usage: $0 'regex'"
   exit 1
fi

grep "$1" file.txt

Примеры:

$ ./wordfind.sh rice
out, owl, rice

$ ./wordfind.sh 'z.*a'
say, toy, zebra

$ ./wordfind.sh 'd, f'
dad, food, girl

Это именно то, что я искал! Спасибо тебе за это! Извините, что мое объяснение было не очень хорошим, я все еще очень новичок и пытаюсь учиться! Я ценю ваше терпение и помощь!

user13784532 11.12.2020 22:23

@ Андрей Не нужно извиняться. Пожалуйста, улучшите свой вопрос, как было предложено.

Bodo 11.12.2020 22:25

Другие вопросы по теме