On 4 May 2006 01:57:21 -0700,
octane@alinto.com wrote:
> Pascal Bourguignon a écrit :
>> Oui, mais là, tu utilises dd. C'est de la triche, on demandait un
>> script shell, pas un dd...
>>
>> #!/bin/bash
>> chars=' !\"#$%&'\''()*+,-./0123456789:;<=>?'
>> chars="$chars"'@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'
>> chars="$chars"'\`abcdefghijklmnopqrstuvwxyz\{\|\}\ ~'
>> echo -n 'Generated: '
>> i=0 ; while [ $i -lt 8 ] ; do
>> echo -n "${chars:$(( $RANDOM % ( 1 + ${#chars} ) )):1}"
>> # I know about print, but it's an external program.
La commande "print" quand elle est externe est plus generalement
une commande pour imprimer. Sinon, c'est un builtin de ksh ou
zsh. C'est printf qu'il faut utiliser, qui est standard et
portable et interne a bash et a la plupart des sh POSIX/Unix.
>> i=$(( $i + 1 ))
>> done
>> echo ''
>>
> Parfait. Merci
A noter que la solution ci-dessus n'est ni standard, ni portable
(ya des bashs qui ne reconnaissent pas -n, ni tres lisible, ni correcte (le
backslash se retrouve une dixaine de fois, le calcul avec
$RANDOM n'est pas correct. Et la distribution de $((RANDOM %
<tout-nombre-qui-n'est-pas-une-puissance-de-deux)) n'est pas
uniforme.
A comparer avec:
awk '
BEGIN {
srand()
for (i = 0; i < 8; i++)
printf "%c", rand() * 95 + 32
print ""
}'
Qui est non seulement correct mais portable, non seulement sur
les systemes conformes a la norme Unix, mais aussi a la norme POSIX
(portable OS interface).
--
Stephane