2013-12-13 2 views
0

Я пишу ОЧЕНЬ простой скрипт bash с статусом «IF». Я писал много раньше, но по какой-то причине он не будет читать аргумент «$ {hitA1} == 0». $ {hitA1} считывается из файла, и он фактически читает его, и он фактически равен 0. Вместо этого он переходит ко второму аргументу «$ {hitA1}! = 0». Есть идеи?Если аргументы не будут читаться

Код:

CorHitA1=0 
MissA1=0 
for i in 44 50 53 58 71 
do 
    late=`expr $i + 1` 
    hitA1=`sed -n ${i}p _TMP_Acc1.txt` 
    hitlateA1=`sed -n ${late}p _TMP_Acc1.txt` 
    if [[ ${hitA1} == 0 ]]; then 
     echo "HEY!!!!!" 
     CorHitA1=`expr ${CorHitA1} + 1` 
    elif [[ ${hitA1} != 0 ]]; then 
     echo "Nope..." 
     echo ${hitA1} 
    fi 
    echo "CorHitA1 = " ${CorHitA1} 
done 
+1

Добавьте 'set -x' в начало вашего скрипта (после' #!/Bin/bash'). Это даст вам кучу отладочного вывода, который должен облегчить выяснение того, что происходит не так. –

+0

Попробуйте добавить 'set -x' в верхней части вашего скрипта для отслеживания выполнения при его запуске. Какие значения тогда? Попробуйте использовать 'if (($ {hitA1} == 0)); тогда да; else # nope; fi' вместо этого. –

+0

Другой [ответ я нашел] (http://stackoverflow.com/questions/669452/is-preferable-over-in-bash-scripts#answer-669486) говорит, что '[[...]]' не является POSIX совместим и может не работать, если вы получили скрипт bash с другой платформы. –

ответ

0

С Баш, вы должны использовать (( для арифметических тестов:

if ((hitA1 == 0)); then ... 

(с оценкой арифметической, вам не нужен $ и не нужно процитировать переменная.)

Или вы можете использовать оператор -eq с [[:

if [[ $hitA1 -eq 0 ]]; then ... 

Если вы не сделаете один из вышеперечисленных, а строка в файле вы экстрагента имеет пробелы в нем, то [[ $hitA1 == 0 ]] будет возвращать ложь, потому что == является строка равенства, и строка с пробелами не так же, как строка без.

+0

Я попытался использовать 'if ((hitA1 == 0)); то ... «но я получил сообщение об ошибке с сообщением») синтаксическая ошибка: недействительный арифметический оператор (ошибка токена « – user3100107

+0

@ user3100107: не используйте редакторов Windows для редактирования сценариев bash. символы возврата каретки, часть протокола окончания строки 'CRLF'. Используйте' dos2unix' или некоторые из них, чтобы избавиться от них. Также: какую версию bash вы используете? – rici

Смежные вопросы