2013-04-11 2 views
0

Как я могу увеличить переменную, уже определенную в bash? Вот что я имею в виду:Bash for loop не понимает переменные правильно?

ID1="YAY1" 
ID2="YAY2" 
for ((c=1; c<=3; c++)) 
    do 
    if [ "$SOMEOTHERVAR" = "ID$c" ]; then BLAH; fi 
    done 

Проблема заключается в том, когда она увеличивает переменную уже определен, чтобы сделать сравнение, он думает, что ID $ с равно строке ID1, а не то, что ID1 равно что YAY1, поэтому если оператор всегда оценивает значение false. Я надеюсь, что в этом есть смысл.

Благодарим за помощь!

** * ***UPDATE* ** * **

Спасибо всем за вашу помощь. Самое чистое решение - использовать единый массив, смешанный с разрезом. Не может быть самым чистым способом, но отлично работает. Вот отрывок ниже:

# CONTACTS 
declare -a EMAIL 
EMAIL[1]="JS:[email protected]" 
EMAIL[2]="JD:[email protected]" 
EMAIL[3]="JK:[email protected]" 

# FUNCTIONS 
function EMAIL { 
    for i in "${!EMAIL[@]}"; do 
    POINTER="`echo ${EMAIL[$i]} | cut -d":" -f1`"; ADDRESS="`echo ${EMAIL[$i]} | cut -d":" -f2`"; 
    if [ "$POINTER" = "$PEMAIL" ]; then TO="$ADDRESS"; fi 
    if [ "$POINTER" = "$SEMAIL" ]; then CC="$ADDRESS"; fi 
    done 
} 

PEMAIL и SEMAIL являются компараторы, которые тянули из базы данных в другой части сценария.

ответ

1

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

declare -a ids 
ids[1]="YAY1" 
ids[2]="YAY2" 
for ((c=1; c < 3; c++)); do 
    if [ "$SOMEOTHERVAR" = "${ids[c]}" ]; then 
     BLAH 
    fi 
done 

Если это не всегда будет целым числом, и у вас есть Баш 4 , вы можете использовать ассоциативный массив:

declare -A ids 
ids['glow']="YAY1" 
ids['stix']="YAY2" 
for c in glow stix; do 
    if [ "$SOMEOTHERVAR" = "${ids[c]}" ]; then 
     BLAH 
    fi 
done 
+0

Это идеальное решение, которое я бы хотел использовать, но я думал, что bash не может обрабатывать массивы по какой-то причине. Возможно, это то, что он не может обрабатывать многомерные массивы, что мне нужно во второй части этого упрощенного примера. Можете ли вы показать мне пример этого, используя многомерный массив? Я давно отказался от использования многомерных массивов в bash, но вы снова вызвали мой интерес. Большое спасибо за помощь. – Atomiklan

+0

т.е. В конце концов мне нужно связать другую переменную с «YAY1». Лучшим примером для реального мира будет: JS: [email protected] Благодарим за помощь. В качестве побочной заметки, я не прошу вас написать это для меня, просто хочу включить в контекст то, что я пытаюсь выполнить. Спасибо! JD: [email protected] Вот логика: если следующая переменная (например, JD, вытащил из другой области сценария) = идентификатор в массиве (JD), затем установите поле CC в [email protected] – Atomiklan

+0

Последняя мысль. Я все еще не думаю, что многомерные массивы возможны в bash, не «подделывая» его. Возможно, лучший способ сделать то, что я пытаюсь сделать, это сказать небольшую базу данных внутри скрипта с использованием двоеточия или значений, разделенных запятыми. JD: JDoe @ пример.com, тогда просто сделайте цикл while с grep и вырежьте, чтобы вытащить необходимую информацию. Все, что я пытаюсь сделать это: в базе данных пользователь «проверяется», чтобы быть включенным в уведомление по электронной почте. Когда они отмечены, они связаны с переменной 2 символа JD, JR и т. Д. Когда скрипт запускается, он видит, кто должен отправить CC на основе var. – Atomiklan

2

Создать промежуточную переменную (которую я назвал newVar), который строит имя переменной. Тогда разыграем это. Следующий код будет печатать "матч для индекса 2"

ID1="YAY1" 
ID2="YAY2" 
for ((c=1; c<=3; c++)) 
    do 
    newVar="ID${c}" 
    if [ "YAY2" = "${!newVar}" ]; then echo "match for index $c"; fi 
    done 
+0

Благодарим вас за помощь. Я общался с этой идеей, но, к сожалению, я не мог связать две переменные так, как они должны были быть. См. Обновление в исходном сообщении. Спасибо! – Atomiklan

0

раствора без контура C-стиля:

ID1="YAY1" 
ID2="YAY2" 

for name in ${!ID*}; do 
    if [ "$SOMEOTHERVAR" == "${!name}" ]; then echo "match for $name"; fi 
done 

$ {ID *!} Расширяющихся к списку всех переменных с префиксом ' Я БЫ'.

+0

Отлично, спасибо за помощь. У вас не было возможности прочитать ваше предложение. Уже найдено решение. Однако, спасибо! – Atomiklan

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