LINUX.ORG.RU

shell программинг ( перебор )


0

0

Здраствуйте.
Как реализовать на shell скриптах такое :

perem=0;
to_chto_nushno=k;
while perem == to_chto_nushno do
{
     perem=`спец участок`;
     echo $perem;
}

так вот `спец участок` должен быть наверно ф-цией :
perem = func ( perem )
которая возвращает : если perem=0  -> то возвращает 1
                                   если perem=4 -> то возвращает 5
                                   если perem=9 -> то a
                                   если perem=c -> то d
                                   если perem=z -> то 00
                                   если perem=00 -> 01
и так далее ... 
Подскажите как это делается. Или дайте ссылку на похожие скрипты.
Спасибо большое.
anonymous
Ответ на: комментарий от ananas

Не case не удовлетворяет требованиям увелечения кол-ва символов. Потому что в результате я хочу чтоб задавался каким либо способом "алфавит" который будет перебираться на всевозможные значения и число определяющее кол-во символов до которого будет вестись перебор. Т.е. дан алфавит : a,b,c и число 3. Результат : a,b,c,aa,ab,ac,ba,bb,bc,ca,cb,cc,aaa,aab,aac,aba,abb,abc,aca ... и т.д. до ... ccc. Алфавит может состоять из любых символов. В принципе кой какие навыки я с shell программированием имею. Читал http://www.citforum.ru/programming/shell/ и еще какую то доку. Но этих знаний мне недостаточно для написания такого скрипта. Поэтому и решил обратится на форум.

anonymous
()
Ответ на: комментарий от anonymous

> Не case не удовлетворяет требованиям увелечения кол-ва символов.

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

ananas ★★★★★
()
Ответ на: комментарий от ananas

А вы не могли бы показать пример? Как делается с шаблоном(чтоб незваисимо от символов данного алфавита)? Честно не могу понять :( . Спасибо.

anonymous
()
Ответ на: комментарий от anonymous

#! /bin/sh

for i in *; do
  case $i in
    *.h)
	echo "$i - header"
	;;
    *.c)
	echo "$i - source"
	;;
    *)
	echo "$i unknown"
	;;
  esac
done

ananas ★★★★★
()
Ответ на: комментарий от anonymous

> Потому что в результате я хочу чтоб задавался каким либо способом
> "алфавит" который будет перебираться на всевозможные значения и число
> определяющее кол-во символов до которого будет вестись перебор. 
> Т.е. дан алфавит : a,b,c и число 3. Результат :
> a,b,c,aa,ab,ac,ba,bb,bc,ca,cb,cc,aaa,aab,aac,aba,abb,abc,aca ... и т.д.
> до ... ccc.

..гы, а потом все в md5 и в базу mysql с web интерфейсом )))
вот тебе перловый код:

#!/usr/bin/perl
# CopyRight (C) 2004.
# mailto:SandySandy\@Rambler.Ru
sub func1{
# в @M словарь
@M = ( 'a', 'b', 'c' );
$T = shift;
    $R = 0;
    @S = reverse( split(//, $T));
    sub f{
        unless( $S[$R] eq $M[$#M] ){
	    $S[$R] = $M[index( join('', @M), $S[$R] ) + 1];
	    return }
	unless( scalar @S == $R + 1 ){
	    ++$R;
	    &f;
	    --$R;
	}else{
	    @S = ( $M[0] ) x scalar @S + 1;
	    return }
	$S[$R] = $M[0];
	return;
    }
    &f;    
    return $T = reverse( join('', @S));
}
# с какого символа начнем
$str = 'a';
# ...э то самое число 3 здесь
while(length $str < 4 ){
        print $str,"\n";
	$str = func1($str);
}

и на перле легче прикручивать криптованые модули..
з.ы. с тебя урл ;)

SandySandy
()
Ответ на: комментарий от anonymous

enumerator_helper()
{
    if test $1 -gt 1; then
        enumerator_helper $(expr $1 - 1) $2 | join - $2
    else
        if test $1 -eq 1; then
            cat $2
        fi
    fi
}

# $1: alphabet
# $2: len
enumerator_fixed()
{
    ENUMTMP=$(mktemp /tmp/enum.XXXXXXXX)
    echo -n $1 | sed 's/\(.\)/1 \1\n/g' > $ENUMTMP
    enumerator_helper $2 $ENUMTMP | cut -d ' ' -f 2- | tr -d ' '
}

# $1: alphabet
# $2: maxlen
enumerator()
{
    if test $2 -gt 1; then
        enumerator $1 $(expr $2 - 1)
    fi
    enumerator_fixed $1 $2
}

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

Хе .. и я попробовал, пробел в алфавит не вставить.

anonymous
()
Ответ на: комментарий от dilmah

echo -n $1 | sed 's/\(.\)/1 \1\n/g' > $ENUMTMP

эта строчка с sed'ом непортабельна. Лучше:

echo -n $1 | sed 's/\(.\)/1\1 /g' | tr ' ' \\n | sed 's/^1/1 /' > $ENUMTMP

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.