linux - bash代码有问题

标签 linux bash

function dec_to_bin {   

if [ $# != 2 ]  
then
    return -1
else
    declare -a ARRAY[30]
    declare -i INDEX=0
    declare -i TEMP=$2
    declare -i TEMP2=0 

    while [ $TEMP -gt 0 ]
    do
        TEMP2="$TEMP%2"
        #printf "%d" "$TEMP2"
        ARRAY[$INDEX]=$TEMP2
        TEMP=$TEMP/2
        INDEX=$[ $INDEX + 1 ]  #note

    done

    for (( COUNT=INDEX; COUNT>-1; COUNT--)){

        printf "%d" "${ARRAY[$COUNT]}"  <<LINE 27
        #echo -n ${ARRAY[$COUNT]}       <<LINE 28
    }
fi
 }

为什么这段代码会报错

q5.sh: line 27: ARRAY[$COUNT]: unbound variable

如果未注释,第 28 行会出现相同的错误

还有一个问题,我对 bash 脚本中使用的 b/w '' 和 ""的区别感到困惑任何指向一些好文章的链接都会有所帮助。

最佳答案

它对我来说很好,除了你不能做 return -1。通常的错误值为 1

错误消息是因为你有 set -u 并且你在 INDEX 而不是 INDEX 开始你的 for 循环-1(由于 while 循环的编写方式,${ARRAY[INDEX]} 将始终为空)。由于您在 printf 语句中使用了 %d,因此空变量将打印为“0”(如果 set -u 未生效).

还有,声明一个有大小的数组是没有意义的。 Bash 中的数组是完全动态的。

我会用 0 测试编写 for 循环(因为 -1 看起来很困惑,因为它不能是索引数字索引数组):

for (( COUNT=INDEX - 1; COUNT>=0; COUNT--))

此表单已弃用:

INDEX=$[ $INDEX + 1 ]

改用这个:

INDEX=$(( $INDEX + 1 ))

或者这个:

((INDEX++))

我还建议养成使用小写或混合大小写变量的习惯,以减少变量名与 shell 变量发生冲突的机会。

您没有使用 $1 做任何事情。

关于linux - bash代码有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4646902/

相关文章:

linux - 打开 zip 文件时出错或缺少 : jrebel. jar 的 JAR list

linux - 在两个地方查找文件的位置 bash linux

c - Grep 永不返回

bash - 如何使用即时定义的 bash 完成函数?

linux - 如何检查文件大小是否没有增加,如果没有则杀死脚本的$$

linux - 检查文件中的值是否大于或等于 bash 脚本中的值

bash - 如何从日期中减去5分钟

linux - 将数据转换为指定形式

java - 透明背景 JFrame Linux 上的动画

bash - 在子文件夹中查找具有特定文件命名的 mp4 文件,并使用 ffmpeg 每秒从中提取帧