2016-03-19 8 views
0

У меня есть простой код:Каким образом выполняются параметрические условия?

compare() 
{ 
     n=$# 
     echo "Refference number: " 
     read x 

     while [ $n -gt 0 ] 
       do 
       if [ $1 -gt $x ] 
         then 
         echo "A greater number was found: " $1 
       fi 
       shift 
     done 
} 

Таким образом, сценарий не работает хорошо. Я получаю бесконечный цикл с ошибкой в ​​строке while.

Если я заменяю это на линии while [ $# -gt 0 ], все работает нормально.

Почему это происходит? Isnt $ n = $ #? Я использую CentOS 7.

+0

Какая ошибка вы получаете? – choroba

+2

Вы, кажется, ожидаете, что расширение '$ n' будет оценено лениво. Технически это возможно с использованием арифметического контекста, но это будет довольно запутанный подход. Почему бы вам просто не обратиться к буквальному '$ #'? – kojiro

+0

Мне просто нужна переменная, которая хранит $ #, и если бы я мог ее использовать, я сказал: «Почему бы и нет?». Я не понимаю, что вы сказали с ленивой оценкой. :/ – Marko

ответ

3

Вы можете использовать $# непосредственно в цикле while. Естественно, он будет меняться каждый раз, когда вы звоните shift.

while [ $# -gt 0 ]; do 
    ... 
    shift 
done 

В противном случае, вам придется обновить $n себя каждую итерацию.

while [ "$n" -gt 0 ]; do 
    ... 
    shift 
    ((--n)) 
done 

Назначение n=$# делает $n равным $# в тот момент времени. Это не значит, что он автоматически обновляется при изменении $#.

+0

Я вижу теперь проблему, спасибо! Еще одна вещь, если это определенно: Если я положу n = $ # после команды shift, это должно быть хорошо, пока ["$ n" -gt 0] также, не так ли? – Marko

+0

Я все равно придерживаюсь всего лишь '$ #', но да, это сработает. –

+0

Я понимаю, что это лучшая практика с $ #, теперь это ясно. Вопрос состоял в том, чтобы узнать, правильно ли я понял. Спасибо! :) – Marko

1

$n содержит копию значения $# на момент ее назначения. После этого ничего не меняется $n, поэтому цикл работает либо вовсе, либо работает непрерывно.

Когда вы используете $# в состоянии цикла, shift уменьшает количество аргументов на единицу, и поэтому $# уменьшается, и цикл завершается.

+0

Когда команда сдвига останавливает декремент $ #? Что произойдет, если я все еще позвоню после того, как у меня не останется никаких аргументов? – Marko

+1

Скорее всего, значение '$ #' остается равным нулю, а пустой список аргументов остается пустым. Смешно, я никогда не помню, чтобы проверить, что произойдет; это не показалось интересным. - _ [... время проходит ...] _ - Нет ошибки, а '$ #' остается на нуле, и до сих пор нет аргументов. –

+0

Приятно знать, спасибо, Джонатан! :) – Marko

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