Ao ler sua pergunta, lembrei-me sempre de ter um script simples que facilitasse a busca de arquivos por uma determinada string e, em seguida, analisasse um dos arquivos que continha a string. Com base no seu script e na sugestão da saga de usar uma matriz, criei meu script e também terminei o seu. :)
Por favor, note: Este script é / bin / bash, não / bin / sh, porque eu não sei como fazer o array funcionar em / bin / sh ...
Seu script:
#!/bin/bash
# Collect Customer ID as input
read -p "Enter Customer ID: " custid
echo "Searched customer ID $custid found in following logs: "
# Find the customer id as string in specified directory
arr=( $(find /usr/local/tomcat9/logs/ -type f -exec grep -l "$custid" {} \; | sort -r) )
if [ ${#arr[@]} -eq 0 ]; then
echo "No matches found."
else
arr+=('Quit')
select opt in "${arr[@]}"
do
case $opt in
"Quit")
break
;;
*)
vim $opt
break
;;
esac
done
fi
EDIT: Embora o script acima funcione perfeitamente para a pergunta original, eu construí sobre a resposta de Wildcard, então meu script pode manipular arquivos com espaços vazios e oferece várias ferramentas para abrir o arquivo selecionado. arquivo.
Meu script:
#!/bin/bash
# Find string in files of given directory (recursively)
read -p "Enter search string: " text
read -p "Enter directory: " directory
#arr=( $(find $directory -type f -exec grep -l "$text" {} \; | sort -r) )
#find $directory -type f -exec grep -qe "$text" {} \; -exec bash -c '
file=$(find $directory -type f -exec grep -qe "$text" {} \; -exec bash -c 'select f; do echo $f; break; done' find-sh {} +;)
if [ -z "$file" ]; then
echo "No matches found."
else
echo "select tool:"
tools=("nano" "less" "vim" "quit")
select tool in "${tools[@]}"
do
case $tool in
"quit")
break
;;
*)
$tool $file
break
;;
esac
done
fi