Я пытаюсь найти файл, чтобы найти слово, используя 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, чтобы выйти из него. Спасибо.
если вы собираетесь хардкодить filename='file.txt'
, то зачем запрашивать у пользователя имя файла (read -r filename
)? Кстати, сценарий, вероятно, «зависает», потому что он ждет, пока вы введете имя файла (т. е. read -r filename
говорит сценарию ждать, пока пользователь что-то введет и нажмет <enter>); также не уверен, чего вы пытаетесь достичь с помощью конструкций "${4|1|2}"=....
, и как любой из них должен запускать команду grep
; возможно, вы хотите что-то столь же простое, как grep "${1:-undefined}" "${filename}"
?
Привет и добро пожаловать! Каков ожидаемый результат?
@Madman Я пытаюсь заставить его найти слово «рис» в файле .txt. $1, $2 и т. д. находятся в скрипте, поэтому вам не нужно вводить всю команду в командной строке. Вместо того, чтобы набирать ./wordfind.sh grep -Rris file.txt , я хочу просто ввести ./wordfindris , и он найдет слово рис. Надеюсь это имеет смысл.
Также (повторно) использовать позиционные переменные в присваиваниях - плохая идея; в вашем случае "$1"=grep
перезапишет все, что пользователь передал в командной строке.
@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
вы снова добавите те же строки в файл. Это то, чего ты хочешь?
Вопрос недостаточно ясен.
Этот ответ предполагает, что вы хотите вызвать свой скрипт со строкой или регулярным выражением в качестве первого аргумента, т. е. условие поиска должно быть заключено в кавычки, если оно содержит пробелы или специальные символы.
Вы можете изменить сценарий 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
Это именно то, что я искал! Спасибо тебе за это! Извините, что мое объяснение было не очень хорошим, я все еще очень новичок и пытаюсь учиться! Я ценю ваше терпение и помощь!
@ Андрей Не нужно извиняться. Пожалуйста, улучшите свой вопрос, как было предложено.
если вы проверяете регулярное выражение, где это регулярное выражение?