Comparação entre Número Complexo e String

-1

Em um script bash, o usuário digita um número de oito dígitos após receber uma solicitação de entrada.

echo "Enter an 8-digit number."
read NUM

Depois disso, é executada uma função que gera um número aleatório de um único dígito.

main() {
GEN="$(shuf -i 0-9 -n 1)"
echo "$GEN"
}
main

O que eu preciso saber é, eu preciso do número que é gerado aleatoriamente para ser comparado com cada inteiro da entrada do usuário. Então primeiro o lugar do 1 é comparado, então o lugar do 10 é comparado, depois o do 100, e assim por diante até que todos os 8 dígitos tenham sido comparados.

Minha pergunta é: como posso comparar o número gerado com um valor de lugar específico na entrada do usuário e, depois que esse número tiver sido correspondido, comparar a função com o próximo valor de local?

(EDITAR)

Esse script é o que eu preciso fazer com cada valor de local individual na entrada do usuário em sequência.

#!/bin/bash
clear

echo "Enter a 3-digit number."
read Num

main() {

Gen=$(shuf -i 0-999 -n 1)
echo "$Gen"

if [ "$Gen" == "$Num" ]
then
echo "Match found!: $Gen"
sleep 3
clear
exit 0
fi

}


while true
do
main
done
    
por Yokai 25.05.2016 / 02:45

1 resposta

1

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
    
por steeldriver 25.05.2016 / 04:51