2013-12-03 7 views
0

У меня есть ниже сценарий:массив в Баш скрипт

for ((i=0; i <= (${#arr1[@]} - 1); i++)); do 
    if [[ ${arr1[i]} > 100 ]]; then 
    echo "=> x" 
    iptables -A INPUT -s 192.168.162.1 -j DROP 
    exit 
    else 
    echo "=> y" 
    fi 
done 

В моем массиве, ни один элемент> 100, все выходные данные должны быть «=> у». когда arr1[i]=1, все в порядке. выход: «=> у» Но когда arr1[i]=5 или что-то не один, у него есть проблемы, выход «=> х»

Я думаю, что моя проблема здесь if [[ ${arr1[i]} > 100 ]] но я не знаю, как изменить его. :(

Помоги мне это исправить, пожалуйста, спасибо

ответ

2

Есть две проблемы с тем, что вы сделали:..

  1. Вы должны сказать if [[ ${arr1[$i]} > 100 ]]; then (обратите внимание, что это должно быть $i вместо i).

  2. Говоря if [[ ${arr1[$i]} > 100 ]]; является неправильно. Это выполняет Lexi copgraphic сравнение и не совсем то, что предназначено. Или сказать:

    if [[ ${arr1[$i]} -gt 100 ]]; then

    или

    if ((${arr1[$i]} > 100)); then

+1

Первый не представляет проблемы. Из 'man bash': *« Нижний индекс рассматривается как арифметическое выражение «*. – tom

+0

>: -gt. Итак, с> =, <, <=, == как ??? Большое спасибо – TrungTrung

+0

@TrungTrung Дополнительную информацию об условных выражениях можно найти здесь (http://www.gnu.org/software/bash/manual/bashref.html#Bash-Conditional-Expressions). – devnull

1

вы должны использовать -gt, больше

+0

>: -gt. Итак, с> =, <, <=, == как ??? Большое спасибо – TrungTrung

+0

, пожалуйста, обратитесь к руководству abs http://www.tldp.org/LDP/abs/html/refcards.html#AEN22313 – ray

4

Вы хотите либо:

if ((${arr1[$i]} > 100)); then 

или POSIX оболочек, которые не поддерживают (()), вы можете использовать:

if [[ ${arr1[$i]} -gt 100 ]]; then 

Here is a good list of other comparison operators.

+0

>: -gt. Итак, с> =, <, <=, == как ??? Большое спасибо – TrungTrung

+0

@TrungTrung См. Ссылку в конце моего ответа. – mVChr

0

Поскольку вы не используете i ни для чего кроме индексации массива, это будет проще перебрать значений массива непосредственно:

for value in "${arr1[@]}"; do 
    if ((value > 100)); then 
     echo "=> x" 
     iptables -A INPUT -s 192.168.162.1 -j DROP 
     exit 
    else 
     echo "=> y" 
    fi 
done 

Это включает в себя еще один вариант для сравнения двух правильно целочисленные значения, команда ((...)), которая предоставляет контекст, где > может использоваться для численного сравнения вместо сравнения строк.

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