复数与字符串比较

复数与字符串比较

在 bash 脚本中,用户在提示输入后输入一个 8 位数字。

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

此后,将执行一个生成一位数随机数的函数。

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

我需要知道怎么做的是,我需要将随机生成的数字与用户输入的每个整数进行比较。因此,首先比较个位,然后比较十位,然后比较百位,依此类推,直到比较完所有 8 位数字。

我的问题是,如何将生成的数字与用户输入中的特定位值进行比较,并且一旦该数字匹配,就让函数与下一个位值进行比较?

(编辑)

我需要通过这个脚本按顺序对用户输入中的每个单独的位置值进行处理。

#!/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

答案1

bash shell 支持${s:$i:1}引用i字符串的第 字符的语法s(严格来说,是从位置 开始的长度为 1 的子字符串$i),因此你可以执行以下操作

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

如果你想循环随机数字,直到找到匹配项,你可以这样做

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

为了提高效率,您可能需要考虑$(shuf -i 0-9 -n 1)$((RANDOM % 10))使用 shell 内置函数RANDOM代替外部函数来替换shuf,除非您认为生成的整数分布shuf对您的应用程序很重要:最终的脚本是

#!/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

并测试它我们得到

$ ./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

相关内容