проверка строки в bash, чтобы проверить, является ли она доменом

#bash #if-statement #verification

Вопрос:

Я работаю над проектом в Bash, который берет файл xlsx в реальном времени, преобразует его в файл csv и проверяет файл, чтобы убедиться, что данные внутри него являются URL-адресами. Это часть более масштабной программы, которая в конечном итоге будет проверять каждый URL-адрес на предмет приседания домена.

У меня возникли проблемы с проверкой строковых данных. Мне приходится учить себя башу по ходу дела, так как это занятие по самообучению. Спасибо за помощь!

 INPUT=domain3.csv 
while IFS= read -r line
do
   if [[ "$line" == *".com"*] || [ "$line" == *".net"*] || [ "$line" == *".org"*] || [ "$line" == *".biz"*]];
   
   then echo "$line"

    else echo "$line is not an URL"
   fi
    echo "Finished!"
done
 

Комментарии:

1. Поместите допустимую ошибку и вставьте свой скрипт в shellcheck.net для подтверждения/рекомендаций.

2. I am having problems — но какие проблемы?

3. Существует множество URL-адресов, которые не являются .com/.net/.org/.biz.

4. Ваша смесь [[ и [ не сработает. Вам также нужны пробелы перед ]

5. это ошибка, которую я получаю ver_loop.sh: строка 8: [: отсутствует ]' ver_loop.sh: line 8: [: missing ]’ ver_loop.sh: строка 8: [: отсутствует ]' ver_loop.sh: line 8: [: missing ]’ не является завершенным URL-адресом!

Ответ №1:

Используйте =~ для выполнения сопоставления регулярных выражений:

 if [[ $INPUT =~ .(com|net|org)$ ]]
then
    echo $INPUT is a domain
else
    echo $INPUT is not a domain
fi
 

Выражение гласит, что если $INPUT соответствует точке ( .), затем одному из «com», «net» или «org», затем концу строки ($), то это домен.

Ответ №2:

[[ ... ]] (начиная с bash 4.1) временно включает эту extglob опцию, чтобы вы могли написать

 if [[ "$line" == *.@(com|net|org|biz)* ]]; 
 

Вам , вероятно, на самом деле не нужен трейлинг * , который позволил бы вам сопоставлять такие вещи, как foo.comzzz .

Комментарии:

1. Поэтому, когда я пытаюсь это сделать, я получаю вывод не закончен URL-адрес!

2. Какую версию bash вы используете? echo $BASH_VERSION

Ответ №3:

Изложение дела.

 #!/bin/sh

while IFS= read -r line; do
  case $line in
    *.com|*.net|*.org|*.biz)
       echo "$line";;
    *) printf >amp;2 '%s is not a url!n'  "$line" ;;
  esac
done
 

Ответ №4:

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

 while IFS= read -r line
do
  if [[ "$line" == *".com"* ]] || [[ "$line" == *".net"* ]] || [[ "$line" == *".org"* ]] || [[ "$line" == *".biz"* ]]
  then
    echo "$line"
  else
    echo "$line is not an URL"
  fi
done < $INPUT
echo "Finished!"