
Я хочу создать скрипт bash, который найдет все слова, начинающиеся с введенной пользователем буквы в указанном файле (указанном в скрипте или создав пользовательский ввод для него тоже). Я немного больше, чем полный новичок в Linux, мой код:
#! /bin/bash
echo 'Please enter starting letter of Name'
read name
result=$(awk '/$name/ {print}' /home/beka/scripts/names.txt)
echo "$(result)"
это приводит к ошибке типа:
Please enter starting letter of Name
G
/home/beka/scripts/test.sh: line 6: result: command not found
что я делаю не так? Я пытался искать примеры awk, но не могу найти точного решения. Спасибо заранее.
ОТРЕДАКТИРОВАННЫЙ КОД
#! /bin/bash
echo 'Please enter starting letter of Name'
read name
if [[ $name == [A-Z] ]]
then
awk "/$name/{print}" /home/beka/scripts/names.txt
else
echo '0'
fi
EDIT names.txt — это список имен
Michael
Christopher
Jessica
Matthew
Ashley
Jennifer
Joshua
ДРУГОЕ ИЗМЕНЕНИЕ
#! /bin/bash
echo 'Please enter starting letter (Uppercase) of name'
read name
if [[ $name == [A-Z] ]]
then
echo "---Names starting with $name---"
awk "/$name/{print}" /home/beka/scripts/names.txt
elif [[ $name == [a-z] ]]
then
awk "/$name/{print}" /home/beka/scripts/names.txt
else
echo '---------'
echo 'Names not found'
fi
решение1
echo "$(result)"
пытается выполнить команду, названную result
любезно частью $(result)
, отсюда и сообщение об ошибке result: command not found
.
Попробуйте это (не проверено):
#!/usr/bin/env bash
result=''
while [[ -z "$result" ]]; do
echo 'Please enter starting letter of Name'
read name
if [[ $name == [A-Z] ]]
then
result=$(awk -v name="$name" 'index($0,name)==1' /home/beka/scripts/names.txt)
else
echo '0'
fi
done
echo "$result"
Чтобы сделать поиск нечувствительным к регистру:
awk -v name="$name" 'index(tolower($0),tolower(name))==1' /home/beka/scripts/names.txt
Очевидно, вам также придется изменить $name == [A-Z]
на $name == [a-zA-Z]
или $name == [[:alpha:]]
, если вы хотите иметь возможность принимать строчные буквы в качестве символа поиска.