为什么我得到错误行83:[::以下代码所需的整数表达式

时间:2014-11-03 16:47:48

标签: bash scripting

populateNumbersArray() {
    declare -ai numbers
    ## error on the following line
    while [ "$counter" -lt $numNumbers ] && [ -z ${numbers[$counter]} ] || [ "${numbers[$counter]}" -le 0 ]
    do
        read -p "Please enter number $counter (1 or bigger): " numbers[$counter]
        if [ "${numbers[$counter]}" -le 0 ]
        then
            echo -e "\nIncorrect input. Please try again\n"
            sleep 1
            clear
        else
            setCounter
        fi
    done
    printNumbers numbers[@];
}

我已尝试使用var名称等引用。代码仍然运行良好,但我想消除错误消息。

3 个答案:

答案 0 :(得分:0)

您可能只需要在while循环之前初始化counter的值(可能为零)。尽管unset变量和值为空字符串的变量之间几乎没有实际区别,但[命令在处理各种比较运算符时不会将空字符串视为0(-lt-le等。)

答案 1 :(得分:0)

当变量实际为空时,

[ -z $unquoted[variable ]无法正常工作。

在这种情况下,它评估为[ -z ],与预期目标相反,它由测试[ '-z' ]处理,然后作为[ -n '-z' ]处理,测试从{{1}开始}是一个非零长度的字符串。

此时行中的最后一个测试将被评估为-z,它在整数上下文中有一个空字符串并生成错误。

答案 2 :(得分:0)

由于Etan的三元评论,我解决了我的问题:

populateNumbersArray() {
    declare -ai numbers
    while [ "$counter" -lt $numNumbers ]
    do
        while [ -z "${numbers[$counter]}" ] || [ "${numbers[$counter]}" -le 0 ]
        do
            read -p "Please enter number $counter (1 or bigger): " numbers[$counter]
            if [ "${numbers[$counter]}" -le 0 ]
            then
                echo -e "\nIncorrect input. Please try again\n"
                sleep 1
                clear
            fi
        done
        setCounter
    done
    printNumbers numbers[@]
}