EMails, такие как «адрес @ localhost» и «user@192.168.1.2», фактически являются действительными адресами, и вы можете протестировать их, запустив собственный почтовый сервер (обычно это делается путем изменения файла хоста). Однако для полного решения:
''' <summary>
''' METHODS FOR SENDING AND VALIDATING EMAIL
''' </summary>
''' <remarks></remarks>
Public Class email
''' <summary>
''' check if email format is valid
''' </summary>
''' <param name="emailAddress">[required] Email address.</param>
''' <param name="disallowLocalDomain">[optional] Allow headers like "@localhost"?</param>
''' <param name="allowAlerts">[optional] Enable error messages?</param>
''' <returns>Returns true if email is valid and false otherwise.</returns>
''' <remarks></remarks>
Public Shared Function isValid(ByVal emailAddress As String,
Optional ByVal disallowLocalDomain As Boolean = True,
Optional ByVal allowAlerts As Boolean = True
) As Boolean
Try
Dim mailParts() As String = emailAddress.Split("@")
If mailParts.Length <> 2 Then
If allowAlerts Then
MsgBox("Valid email addresses are formatted [sample@domain.tld]. " &
"Your address is missing a header [i.e. ""@domain.tld""].",
MsgBoxStyle.Exclamation, "No Header Specified")
End If
Return False
End If
If mailParts(mailParts.GetLowerBound(0)) = "" Then
If allowAlerts Then
MsgBox("Valid email addresses are formatted [sample@domain.tld]. " &
"The username portion of the e-mail address you provided (before the @ symbol) is empty.",
MsgBoxStyle.Exclamation, "Invalid Email User")
End If
Return False
End If
Dim headerParts() As String = mailParts(mailParts.GetUpperBound(0)).Split(".")
If disallowLocalDomain AndAlso headerParts.Length < 2 Then
If allowAlerts Then
MsgBox("Valid email addresses are formatted [sample@domain.tld]. " &
"Although addresses formatted like [sample@domain] are valid, " &
"only addresses with headers like ""sample.org"", ""sample.com"", and etc. " &
"[i.e. @domain.org] are accepted.",
MsgBoxStyle.Exclamation, "Invalid Header")
End If
Return False
ElseIf headerParts(headerParts.GetLowerBound(0)) = "" Or
headerParts(headerParts.GetUpperBound(0)) = "" Then
If allowAlerts Then
MsgBox("Valid email addresses are formatted [sample@domain.tld]. " &
"Your header """ & mailParts(mailParts.GetUpperBound(0)) & """ is invalid.",
MsgBoxStyle.Exclamation, "Invalid Header")
End If
Return False
End If
Dim address As MailAddress = New MailAddress(emailAddress)
Catch ex As Exception
If allowAlerts Then
MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Invalid Email Address")
End If
Return False
End Try
Return True
End Function
End Class 'email'
Если вы хотите рекурсивно переходить в каталоги, выполняя команду для каждого файла, найденного в них, я бы использовал команду find
вместо того, чтобы писать что-либо с помощью сценария оболочки, Я думаю.
Эта команда может получать множество параметров, например type
для фильтрации типов возвращаемых файлов или exec
для выполнения команды для каждого результата.
Для Например, чтобы найти каталоги, которые находятся в том, в котором я сейчас нахожусь:
find . -type d -exec echo "Hello, '{}'" \;
Что даст мне что-то вроде:
Hello, '.'
Hello, './.libs'
Hello, './include'
Hello, './autom4te.cache'
Hello, './build'
Hello, './modules'
То же самое, чтобы найти файлы в текущем каталоге:
find . -type f -exec echo "Hello, '{}'" \;
, что даст мне что-то вроде этого:
Hello, './config.guess'
Hello, './config.sub'
Hello, './.libs/memcache_session.o'
Hello, './.libs/memcache_standard_hash.o'
Hello, './.libs/memcache_consistent_hash.o'
Hello, './.libs/memcache.so'
Hello, './.libs/memcache.lai'
Hello, './.libs/memcache.o'
Hello, './.libs/memcache_queue.o'
Hello, './install-sh'
Hello, './config.h.in'
Hello, './php_memcache.h'
...
Кто-то скажет: «Это не ракушка» ... Но зачем изобретать колесо заново?
(И, в некотором смысле, это оболочка ^^)
Для получения дополнительной информации вы можете взглянуть на:
человек найти
Как-то так должно достичь вашей цели:
function RecurseDirs
{
oldIFS=$IFS
IFS=\n'
for f in "$@"
do
-----your activity here-----
if [[ -d "${f}" ]]; then
cd "${f}"
RecurseDirs $(ls -1 ".")
cd ..
fi
done
IFS=$oldIFS
}
Посмотрите на команду find
и проверьте переключатели -type
(используйте d, чтобы указать каталог) и -exec
(чтобы указать команду для выполнения).
Bash 4.0 представил опцию globstar, поэтому такая конструкция, как:
for f in mydir/**/*
do
# operations here
done
... будет действовать рекурсивно на любых землях в $ f. Включите это с "shopt -s globstar", иначе ** будет рассматриваться как единственное число *.
Сегодня нашел этот драгоценный камень по адресу http://www.linuxjournal.com/content/globstar-new-bash-globbing-option , после того, как вдохновился конструкцией zsh (которую я включил по умолчанию). ).
В некоторых базовых оболочках отсутствуют команды типа «найти», а некоторые из них не поддерживают рекурсивность. В этом случае вы можете использовать этот скрипт для запуска нужной команды во всех подкаталогах дерева:
CDIR=$(pwd)
for i in $(ls -R | grep :); do
DIR=${i%:} # Strip ':'
cd $DIR
$1 # Your command
cd $CDIR
done
Если вы назвали вышеупомянутый «recurse.sh», тогда используйте:
./recurse.sh <command>
Пример (изменить владельца / группу на «корень» всех файлов в дереве):
./recurse.sh "chown 0:0 *"
Для большинства рекурсивных файловых операций вы хотите использовать find
, как объясняют другие ответы.
Существует пример рекурсивного скрипта bash, включенного в пакет bash-doc . Если у вас установлены эти примеры, это будет в /usr/share/doc/bash/examples/functions/recurse
(в Debian).
Извините, я не понимаю, о чем вы спрашиваете. Лучшее, что я могу догадаться по вашему вопросу:
find -type d -exec scriptname.sh \{\} \;