O shell bash suporta a sintaxe ${s:$i:1}
para se referir ao caractere i
th da string s
(estritamente falando, uma subseqüência de comprimento 1 iniciando na posição $i
), para que você possa fazer algo como
Num=13427598
for ((i=0;i<${#Num};i++)); do
Gen=$(shuf -i 0-9 -n 1)
if (($Gen == ${Num:$i:1}))
then
echo "$Gen matches at position $i"
else
echo "$Gen doesn't match"
fi
done
Se você quiser repetir dígitos aleatórios até encontrar uma correspondência, pode fazer algo como
for ((i=0;i<${#Num};i++)); do
while :
do
Gen=$(shuf -i 0-9 -n 1)
n=$((${#Num}-i-1)) # the string index, starting from least significant digit
if (($Gen == ${Num:$n:1}))
then
echo "Matched $Gen at position $((10**i))"
break
fi
done
done
Para eficiência, convém substituir substituindo $(shuf -i 0-9 -n 1)
por $((RANDOM % 10))
, que usa o shell RANDOM
incorporado no lugar da função externa shuf
, a menos que você acredite que a distribuição de números inteiros produzidos por shuf
é importante para seu aplicativo: o script final é
#!/bin/bash
read -p "Enter a number: " Num
for ((i=0;i<${#Num};i++)); do
while :
do
Gen=$(shuf -i 0-9 -n 1)
n=$((${#Num}-i-1)) # the string index, starting from least significant digit
if (($Gen == ${Num:$n:1}))
then
echo "Matched $Gen at position $((10**i))"
break
fi
done
done
e testando nós conseguimos
$ ./number.sh
Enter a number: 16283690
Matched 0 at position 1
Matched 9 at position 10
Matched 6 at position 100
Matched 3 at position 1000
Matched 8 at position 10000
Matched 2 at position 100000
Matched 6 at position 1000000
Matched 1 at position 10000000