За исключением математической части, вот быстрый и грязный POC для выполнения того, что вы собираетесь сделать, но с использованием оператора «if» вместо условий цикла «пока» для вашей логики.
#!/bin/bash
port=$1
echo $port | while read a; do
found=$(cat /etc/services | grep -Eo '[0-9]{1,5}/' | sed 's/^/ /' | grep ' '$a'/')
if [[ $found ]];
then echo port $a is being used
else echo port $a is not being used
fi
done
Редактировать: проблема возникла из-за переменной $found. одинарные кавычки в grep заставляют $port интерпретироваться буквально, поэтому он ищет строку Например, '$port/' вместо '80/'. исправить: просто измените одинарные кавычки на двойные кавычки.
found=$(cat /etc/services | grep -o "[[:space:]]$port/" | wc -l)
Поскольку мы знаем, что файлы, имена которых мы хотели бы иметь, находятся на двух уровнях под / usr / share / terminfo
, и что под ними нет дополнительных каталогов, это будет быстро решение (выполняет только find
и cut
один раз):
$ find /usr/share/terminfo -type f | cut -d '/' -f 6
В качестве альтернативы, с одной чуть более «тяжелой» заменой sed
:
$ find /usr/share/terminfo -type f | sed 's#^.*/##'
The sed Подстановка
удаляет все, включая последнюю /
каждой строки вывода из find
.
(man tree для деталей)
tree -i /usr/shar/terminfo
или, если хотите, удалите каталоги:
tree -iF /usr/shar/terminfo | grep -v /
ls -R /usr/share/terminfo | grep -v /
ls /usr/share/terminfo/*/* | grep -o '[^/]*$'
basename -a $(ls /usr/share/terminfo/*/*)