URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6814
[ Назад ]

Исходное сообщение
"Сравнение строк...помогите!"

Отправлено realship , 05-Окт-07 16:31 
Добрый день!

есть такое сравнение: (система FreeBSD 6.0)

#!/bin/sh

if [ "abc def" = ab* ];then
    echo GOOD
else
    echo BAD
fi

я не понимаю как сделать сравнение одной строки и другой, где другая строка является частью первой...

то есть * - это любые символы, и ? - любой один символ...

помогите плиз!
Спасибо!


Содержание

Сообщения в этом обсуждении
"Сравнение строк...помогите!"
Отправлено vic , 05-Окт-07 17:45 
>я не понимаю как сделать сравнение одной строки и другой, где другая
>строка является частью первой...

а я ваще не понимаю зачем строку с подстрокой сравнивать. Разве чтоб понять что попали на вырожденный вариант.

>то есть * - это любые символы, и ? - любой один символ...

true

Уточнение. Вам не понятно как работает приведенный код или вам надо что-то сравнить (что?) ?


"Сравнение строк...помогите!"
Отправлено realship , 05-Окт-07 18:34 
>[оверквотинг удален]
>
>а я ваще не понимаю зачем строку с подстрокой сравнивать. Разве чтоб
>понять что попали на вырожденный вариант.
>
>>то есть * - это любые символы, и ? - любой один символ...
>
>true
>
>Уточнение. Вам не понятно как работает приведенный код или вам надо что-то
>сравнить (что?) ?

Мне понятно как это работает, проблема в том, что это НЕ работает :) всегда уходит в BAD


"Сравнение строк...помогите!"
Отправлено vic , 05-Окт-07 19:14 
>Мне понятно как это работает, проблема в том, что это НЕ работает
>:) всегда уходит в BAD

if [ "abc def" = ab* ];then

тут ab* будет расширено в случае если будут найдены элементы в каталоге (файлы/подкаталоги) начинающиеся на ab. Причем если будет найдено больше одного элемента начинающегося с ab, то они будут подставлены подряд в строку, например:
if [ "abc def" = ab_file1 ab_file2 ];then
результат ошибка

почаще заглядывайте в man bash, там это все есть :)


"Сравнение строк...помогите!"
Отправлено realship , 05-Окт-07 18:38 
>[оверквотинг удален]
>
>а я ваще не понимаю зачем строку с подстрокой сравнивать. Разве чтоб
>понять что попали на вырожденный вариант.
>
>>то есть * - это любые символы, и ? - любой один символ...
>
>true
>
>Уточнение. Вам не понятно как работает приведенный код или вам надо что-то
>сравнить (что?) ?

Уточнение зачем сравнить: есть переменная например ip адрес, и константа = 192.168.150.
Надо сравнить, если переменная ip из одной подсети, то делаем одно, если из другой, то другое...


"Сравнение строк...помогите!"
Отправлено vic , 05-Окт-07 19:07 
>[оверквотинг удален]
>>
>>true
>>
>>Уточнение. Вам не понятно как работает приведенный код или вам надо что-то
>>сравнить (что?) ?
>
>Уточнение зачем сравнить: есть переменная например ip адрес, и константа = 192.168.150.
>
>Надо сравнить, если переменная ip из одной подсети, то делаем одно, если
>из другой, то другое...

1. регепсы и sed, awk
2. [ `echo $SOME_IP | cut -b-${#SOME_IP}` = "192.168.150." ] && echo true
3. или еще как


"Сравнение строк...помогите!"
Отправлено L0n3R4ng3r , 06-Окт-07 14:05 
>[оверквотинг удален]
>>
>>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


"Сравнение строк...помогите!"
Отправлено phpcoder , 08-Окт-07 09:06 
>[оверквотинг удален]
>
>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"."}'


"Сравнение строк...помогите!"
Отправлено jd , 07-Окт-07 19:04 
>Уточнение зачем сравнить: есть переменная например 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.0

addr=(`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] ))
done

if [ "${addr[*]}" = "${netaddr[*]}" ]; then
  echo true
else
  echo false
fi


"Сравнение строк...помогите!"
Отправлено jd , 07-Окт-07 19:13 
Что-то тут как-то странно всё проинтерпретировалось сайтом... В общем, скрипт должен был выглядеть вот так:

#!/bin/bash
ADDR=192.168.150.3 # то, что нужно проверить
NETADDR=192.168.150.0
MASK=255.255.255.0

addr=(`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] ))
done

if [ "${addr[*]}" = "${netaddr[*]}" ]; then
  echo true
else
  echo false
fi



"Сравнение строк...помогите!"
Отправлено vg , 05-Окт-07 18:17 
>[оверквотинг удален]
>fi
>
>я не понимаю как сделать сравнение одной строки и другой, где другая
>строка является частью первой...
>
>то есть * - это любые символы, и ? - любой один
>символ...
>
>помогите плиз!
>Спасибо!

смотреть в сторону Regular Expression