Bash 为什么我的二进制搜索脚本在输入后不继续执行?

Bash 为什么我的二进制搜索脚本在输入后不继续执行?,bash,shell,Bash,Shell,我编写了一个用于整数二进制搜索的shell脚本。它接受以空格分隔的整数数组,但当代码继续执行并且我们输入要搜索的元素时,代码不会继续执行。它要么被卡住,要么接受更多的输入,这两种输入都是不希望的 代码如下: #!/bin/bash declare -a arr echo "Enter space separated sorted integers:" read -ra arr declare -i search echo -n "Enter the elemen

我编写了一个用于整数二进制搜索的shell脚本。它接受以空格分隔的整数数组,但当代码继续执行并且我们输入要搜索的元素时,代码不会继续执行。它要么被卡住,要么接受更多的输入,这两种输入都是不希望的

代码如下:

#!/bin/bash

declare -a arr
echo "Enter space separated sorted integers:"
read -ra arr

declare -i search
echo -n "Enter the element to be searched for: "
read -r search

index=-1
beg=0
mid=0
last=${#arr[@]}
last=$((last - 1))

while [ $beg -le $last ]; do
    mid=$((beg / 2 + end / 2))
    if [ $mid -eq "$search" ]; then
        index=$mid
        break
    elif [ $mid -gt "$search" ]; then
        end=$((mid - 1))
    elif [ $mid -lt "$search" ]; then
        beg=$((mid + 1))
    fi
done

if [ $index -ne -1 ]; then
    echo "Element found at $index"
else
    echo "Element not found"
fi

好的,下面是我在代码中发现的错误:

  • 使用
    end
    而不是
    last
    (感谢John Kugelman、EdmCoff、markp fuso)
  • 从未像在数组[index]中那样实际比较数组值(感谢markp fuso)
  • 有时,
    mid=$((beg/2+last/2))
    不会表现为mid=(beg+last)/2。有时,当beg,last=5时,beg/2+last/2将在4而不是5中求值
  • 最后但并非最不重要的一点是,在调试中使用echo总是有帮助的(感谢chepner)
  • 最后的工作代码如下所示:

    #!/bin/bash
    
    declare -a arr
    echo "Enter space separated sorted integers:"
    read -ra arr
    
    declare -i search
    echo -n "Enter the element to be searched for: "
    read -r search
    
    index=-1
    beg=0
    mid=0
    last=${#arr[@]}
    last=$((last - 1))
    
    while [ $beg -le $last ]; do
        echo -e "\nbeg=$beg\nmid=$mid\nlast=$last\n"
        mid=$((beg + last))
        mid=$((mid/2))
        if [ "${arr[$mid]}" -eq "$search" ]; then
            index=$mid
            break
        elif [ "${arr[$mid]}" -gt "$search" ]; then
            last=$((mid - 1))
        elif [ "${arr[$mid]}" -lt "$search" ]; then
            beg=$((mid + 1))
        fi
    done
    
    if [ $index -ne -1 ]; then
        echo "Element found at $((index+1))"
    else
        echo "Element not found"
    fi
    
    

    我会在循环中添加一些echo语句,以观察
    beg
    mid
    end
    的值是如何变化的。如果您更新了问题以包括引起问题的数组/搜索值,这会有所帮助。我会特别查看行
    mid=$((beg/2+end/2))
    。我不确定什么是
    end
    ,你可能是说
    $beg
    不是
    beg
    考虑扩展你的评论
    卡住了,或者它正在接受更多的输入
    <代码>卡滞位置/时间?它需要多少输入(相关的提示是什么)?总体设计中还有两个主要缺陷:1)如果用户输入的数字列表不是按顺序排列的,会发生什么?更大的问题2)您所有的测试都(有效地)针对数组的索引。。。在任何情况下,您实际上都没有将
    搜索
    值与数组值/元素进行比较,即没有对
    ${arr[]}
    的引用,因此(例如)在由
    组成的数组中,您永远不会找到编号
    25
    (10 15 20 25 30)
    因为
    beg/end/last/index
    将在
    0
    4
    之间的范围内,请考虑对数组进行排序(即,不要假设用户将输入已排序的数组);在“bash sort array”上运行google搜索以获得相当多的点击率,例如,很高兴您将其排序。为什么不包括输入和输出的示例运行?Good luck.re:关于
    mid=$((beg/2+last/2))
    行为不端的注释:如果您已经了解了为什么它不总是返回所需的值,则无法从您的注释和代码中分辨出来,因此fwiw。。。bash除法返回一个整数,因此:
    (1/2)+(1/2)
    =
    0+0
    =
    0
    ,而
    (1+1)/2
    =
    2/2
    =
    1
    (“Duh,Mark!”);您的新代码解决了这个问题,就像
    mid=$((beg+last)/2))
    当然,忘了提到整数除法一样。我将尽快更新它,并提供示例输入和输出