在 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