Добрый день!есть такое сравнение: (система FreeBSD 6.0)
#!/bin/sh
if [ "abc def" = ab* ];then
echo GOOD
else
echo BAD
fiя не понимаю как сделать сравнение одной строки и другой, где другая строка является частью первой...
то есть * - это любые символы, и ? - любой один символ...
помогите плиз!
Спасибо!
>я не понимаю как сделать сравнение одной строки и другой, где другая
>строка является частью первой...а я ваще не понимаю зачем строку с подстрокой сравнивать. Разве чтоб понять что попали на вырожденный вариант.
>то есть * - это любые символы, и ? - любой один символ...
true
Уточнение. Вам не понятно как работает приведенный код или вам надо что-то сравнить (что?) ?
>[оверквотинг удален]
>
>а я ваще не понимаю зачем строку с подстрокой сравнивать. Разве чтоб
>понять что попали на вырожденный вариант.
>
>>то есть * - это любые символы, и ? - любой один символ...
>
>true
>
>Уточнение. Вам не понятно как работает приведенный код или вам надо что-то
>сравнить (что?) ?Мне понятно как это работает, проблема в том, что это НЕ работает :) всегда уходит в BAD
>Мне понятно как это работает, проблема в том, что это НЕ работает
>:) всегда уходит в BADif [ "abc def" = ab* ];then
тут ab* будет расширено в случае если будут найдены элементы в каталоге (файлы/подкаталоги) начинающиеся на ab. Причем если будет найдено больше одного элемента начинающегося с ab, то они будут подставлены подряд в строку, например:
if [ "abc def" = ab_file1 ab_file2 ];then
результат ошибкапочаще заглядывайте в man bash, там это все есть :)
>[оверквотинг удален]
>
>а я ваще не понимаю зачем строку с подстрокой сравнивать. Разве чтоб
>понять что попали на вырожденный вариант.
>
>>то есть * - это любые символы, и ? - любой один символ...
>
>true
>
>Уточнение. Вам не понятно как работает приведенный код или вам надо что-то
>сравнить (что?) ?Уточнение зачем сравнить: есть переменная например ip адрес, и константа = 192.168.150.
Надо сравнить, если переменная ip из одной подсети, то делаем одно, если из другой, то другое...
>[оверквотинг удален]
>>
>>true
>>
>>Уточнение. Вам не понятно как работает приведенный код или вам надо что-то
>>сравнить (что?) ?
>
>Уточнение зачем сравнить: есть переменная например ip адрес, и константа = 192.168.150.
>
>Надо сравнить, если переменная ip из одной подсети, то делаем одно, если
>из другой, то другое...1. регепсы и sed, awk
2. [ `echo $SOME_IP | cut -b-${#SOME_IP}` = "192.168.150." ] && echo true
3. или еще как
>[оверквотинг удален]
>>
>>true
>>
>>Уточнение. Вам не понятно как работает приведенный код или вам надо что-то
>>сравнить (что?) ?
>
>Уточнение зачем сравнить: есть переменная например ip адрес, и константа = 192.168.150.
>
>Надо сравнить, если переменная ip из одной подсети, то делаем одно, если
>из другой, то другое...something like this:
#! /bin/bash -x
ip=192.168.150.2
net=$(echo $ip |awk 'BEGIN {FS="."} {print $1"."$2"."$3"."}')
our_net=192.168.150.
if [ $our_net == $net ]; then
echo true
else
echo false
fi
>[оверквотинг удален]
>
>ip=192.168.150.2
>
>net=$(echo $ip |awk 'BEGIN {FS="."} {print $1"."$2"."$3"."}')
>our_net=192.168.150.
>if [ $our_net == $net ]; then
> echo true
>else
> echo false
>fiЕсли в скрипте заменить "/bin/bash" на "/bin/sh" и "$our_net == $net" на "$our_net = $net", то это будет более потрабельно.
P.S. А awk 'BEGIN {FS="."} {print $1"."$2"."$3"."}' можно заменить на более короткий вариант: awk -F. '{print $1"."$2"."$3"."}'
>Уточнение зачем сравнить: есть переменная например ip адрес, и константа = 192.168.150.
>
>Надо сравнить, если переменная ip из одной подсети, то делаем одно, если
>из другой, то другое...К слову сказать, начало адреса подсети не всегда совпадает с началом IP адреса (так, как в приведённом вами примере). Всё зависит от маски. Стандартной проверкой на принадлежность к сети является что-то вроде:
<ADDR> = <IP ADDR> AND <MASK> ; <ADDR> == <NETADDR>
где <IP ADDR> проверяемый IP адрес, <NETADDR> - адрес подсети, принадлежность к которой нужно установить, <MASK> - маска этой подсети, AND - побитовое "и", <ADDR> - переменная для сравнения.Реализовать это можно по-разному, в зависимости от средств, которыми вы располагаете. Например на bash это может выглядеть примерно так:
#!/bin/bash
ADDR=192.168.150.3 # то, что нужно проверить
NETADDR=192.168.150.0
MASK=255.255.255.0addr=(`echo $ADDR | tr . ' '`)
netaddr=(`echo $NETADDR | tr . ' '`)
mask=(`echo $MASK | tr . ' '`)
for i in 0 1 2 3; do
addr[$i]=$(( addr[i] & mask[i] ))
doneif [ "${addr[*]}" = "${netaddr[*]}" ]; then
echo true
else
echo false
fi
Что-то тут как-то странно всё проинтерпретировалось сайтом... В общем, скрипт должен был выглядеть вот так:
#!/bin/bash
ADDR=192.168.150.3 # то, что нужно проверить
NETADDR=192.168.150.0
MASK=255.255.255.0addr=(`echo $ADDR | tr . ' '`)
netaddr=(`echo $NETADDR | tr . ' '`)
mask=(`echo $MASK | tr . ' '`)
for k in 0 1 2 3; do
addr[$k]=$(( addr[k] & mask[k] ))
doneif [ "${addr[*]}" = "${netaddr[*]}" ]; then
echo true
else
echo false
fi
>[оверквотинг удален]
>fi
>
>я не понимаю как сделать сравнение одной строки и другой, где другая
>строка является частью первой...
>
>то есть * - это любые символы, и ? - любой один
>символ...
>
>помогите плиз!
>Спасибо!смотреть в сторону Regular Expression