Проблема с кодом Bash - PullRequest
2 голосов
/ 10 января 2011
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, любая ссылка на хорошую статью будет полезна.

1 Ответ

1 голос
/ 10 января 2011

Это прекрасно работает для меня, за исключением того, что вы не можете сделать return -1. Обычное значение ошибки: 1.

Сообщение об ошибке вызвано тем, что у вас есть set -u, и вы запускаете цикл for в INDEX вместо INDEX-1 (${ARRAY[INDEX]} всегда будет пустым из-за того, что цикл while написано). Поскольку вы используете %d в своем операторе printf, пустые переменные будут печататься как "0" (если set -u не действует).

Кроме того, бессмысленно объявлять массив с размером. Массивы в Bash полностью динамичны.

Я бы закодировал цикл for с тестом для 0 (потому что -1 выглядит сбивающим с толку, поскольку он не может быть индексом численно индексированного массива):

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

Данная форма устарела:

INDEX=$[ $INDEX + 1 ]

Используйте это вместо:

INDEX=$(( $INDEX + 1 ))

или это:

((INDEX++))

Я также рекомендую использовать строчные или смешанные переменные как привычку, чтобы уменьшить вероятность конфликта имен переменных с переменными оболочки.

Вы не используете $1 для чего-либо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...