2013-05-15 6 views
0

Это мой массив:Bourne shell - создать цикл для каждого элемента массива?

ListTabs="" 
ListTabs=$ListTabs"T_Tab1\n" 
ListTabs=$ListTabs"T_Tab2\n" 
ListTabs=$ListTabs"T_Tab3" 
echo $ListTabs 
arrArr=0 
OLD_IFS=$IFS; 
IFS=\n 
for listArr in ${ListTabs[@]}; 
do 
    #echo $listArr 
    MYDIR[${ARR}]=$listArr 
    ((arrIdx = $ARR+ 1)) 
done 
IFS=$OLD_IFS; 

тогда, я сделал своего рода идентификатор из избранных таким образом (FILESELECT_DAT является выходной файл запроса):

sort -u ${FILESELECT_DAT} > ${SORT_OUT1} 

ok..Now я должен сделать цикл, который для каждого элемента массива делает SELECT, где ID = значения $ {SORT_OUT1}. Итак, есть 2 цикла. A while on ID и цикл for для выбора. Как я могу закодировать идентификатор внутри $ {SORT_OUT1}? Я думаю, что начнем

id="" 
while read $id 
do 
for ListTabs in ${listArr} 
do 
- 
- 
SELECT * FROM $ListTabs(but the results is alway the first tab in each loop) 
WHERE ID = ${id}(but he show me all IDs) 
- 
- 
done < ${SORT_OUT1} 

Любые идеи? Благодаря

+1

'ListTabs' - это не массив. Это строка. Весь первый блок кода можно заменить на 'listArr = (T_Tab {1,2,3})'. – chepner

ответ

2
listArr=(T_Tab{1,2,3}) 
sort -u "$FILESELECT_DAT" > "$SORT_OUT1" 
while read id; do 
    for ListTabs in "${listArr[@]}"; do 
    ... 
    done 
done < "$SORT_OUT1" 

Позаботьтесь, что ничто в теле for -loop не считывает данные из стандартного ввода, или он будет потреблять часть входа, предназначенного для команды read. Чтобы быть в безопасности, используйте отдельный файловый дескриптор:

while read -u 3 id; do 
... 
done 3< "$SORT_OUT1" 
+0

Это оболочка bourn, так что это единственный способ сделать массив. Ваше решение получило ошибку .. Даже в «done 3 <» $ SORT_OUT1 »выход: 3: Это не идентификатор. –

+0

Вы отметили вопрос как' bash', а не 'sh'. – chepner

+0

Да, но я использую оба bash и sh, и я путаю их. Howevery, sh. –

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