#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!"