2016-05-04 2 views
0

Я хочу сравнить две переменные rkps и rrtt с фиксированными значениями, и если оба удовлетворенных условия увеличивают счетчик на 1. Я написал оболочку для цикла, как показано ниже. Правильно ли это?для цикла с двумя переменными Shell

Также в любом случае, чтобы инициализировать обе переменные в одном для контура вместо выключения

count=0 
for rkps in 1 2 3 4 
do 
for rrtt in 2 3 4 1 

do 
    echo "rkps = $rkps" 
    echo "rrtt =$rrtt" 
     if [[ "$rkps" -ge 1 && "$rrtt" -ge 2 ]]; then 
     echo "Read Kb/s value greater than 1Mbps and RRTT greater than 2 msec" 
     count=$(($count +1)) 
     fi 
done 
done 

if [ $count -gt 1 ]; then 
echo " issue exists" 
fi 

Примечание: Я хочу сравнить, если первое значение в rkps> 1 & & первое значение в rrtt -ной 2, а затем второй, третий значения и т. д. -Спасибо

+0

Ну, если вы хотите, чтобы запустить проверку для каждого значения в rkps например: 1 для всех значений в rrtt т.е. 2, 3, 4, 1. Тогда ваши два цикла решение появляется в порядке. Я не уверен, что вы делаете это вышеизложенное поведение в одиночном цикле. – MSameer

+0

@Msameer Фактически, я хочу сравнить, если значения rkps (один за другим)> 1 и значения в rrtt (один за другим)> 2. Если оба условия истинны, то увеличивайте счет на 1. – Vijay

+0

Вне темы: Замените 'count = $ (($ count +1)) 'with' ((count ++)) '. –

ответ

3

Использование arrays:

arr_rkps=(1 2 3 4) 
arr_rrtt=(2 3 4 1) 

for i in 0 1 2 3 
do 
    echo "rkps=${arr_rkps[i]}, rrtt=${arr_rrtt[i]}" 
done 

Если вы хотите, чтобы перебрать весь массив, вы можете использовать

arr_rkps=(1 2 3 4) 
arr_rrtt=(2 3 4 1) 

for i in ${!arr_rkps[@]} 
do 
    echo "rkps=${arr_rkps[i]}, rrtt=${arr_rrtt[i]}" 
done 
+0

'$ {! Arr_rkps [@]}', как это значение индекса списка в массиве arr_rrtt, как вы упомянули только имя массива arr_rkps? – Vijay

+0

'echo $ {! Arr_rkps [@]}' даст '0 1 2 3', то же самое, что и жестко запрограммированное решение. Если оба массива имеют одинаковый размер, добавление элементов в оба массива будет поддерживать работу кода. –

+0

Или сделайте его более безопасным и сначала определите минимальное значение '$ {! Arr_rkps [@]}' и '$ {! Arr_rrtt [@]}'. –

1

Это ниже сценарий является продолжением решения @ Вальтера-A & он заслуживает всяческих заслуг. Мы инициализировали две массивы: & вычисляют минимальную длину. И, наконец, цикл для каждого значения в массиве (от 0 до minLen) и выполнение счетчика счетчика &.

count=0 
rkps_arr=(1 2 3 4) 
rrtt_arr=(2 3 4 1) 
minLen=$(((${#rkps_arr[@]} < ${#rrtt_arr[@]}) ? ${#rkps_arr[@]} : ${#rrtt_arr[@]})) 

echo "MinLen:${minLen}" 
for((i=0; i< minLen; i++)) 
do 
    rkps=${rkps_arr[i]} 
    rrtt=${rrtt_arr[i]} 
    echo "rkps=${rkps}" 
    echo "rrtt=${rrtt}" 
    if [[ "$rkps" -ge 1 && "$rrtt" -ge 2 ]]; then 
    echo "Read Kb/s value greater than 1Mbps and RRTT greater than 2 msec" 
    ((count++)) 
    fi 
done 

echo "Overall status" 
if [ $count -gt 1 ]; then 
echo " issue exists" 
fi 
+1

Подробнее: 'minLen = $ ((($ {# rkps_arr [@]} <$ {# rrtt_arr [@]}) $ {# rkps_arr [@]}: $ {# rrtt_arr [@]}))' - 1 линия, заменяющая 8. –

+0

@JonathanLeffler, Спасибо, это было слишком многословным и ненужным. Я поправился по вашему предложению. – MSameer

+1

Заменить 'count = $ (($ count +1))' with '((count ++))' –

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