2014-11-28 3 views
0

Я пишу сценарий оболочки. Мне нужно захватить длину массива. Массив - это выход одной команды. Я пробовал это как: N = 0Длина массива в скрипте оболочки

for pid in $(ps -ef | grep java| egrep "tomcat|jboss|JBoss" | awk '{print $2}') ; 
do 
array[$N]="$pid" 

echo "${#array[@]}" 
arraylen=${#array[@]} 
if [ $arraylen=1 ] 
then 
(sleep $sleepTime;jstack ${array[$0]} > jStack_${array[$0]}_prod.txt &) 

elif [$arraylen =2] 
then 
(sleep $sleepTime;jstack ${array[$0]} > jStack_${array[$0]_prod.txt &) 
(sleep 10;jstack ${array[$1]} > jStack_${array[$1]}_prod.txt &) 

elif [$arraylen =3] 
then 
(sleep $sleepTime;jstack ${array[$0]} > jStack_${array[$0]}_prod.txt &) 
(sleep 10;jstack ${array[$1]} > jStack_${array[$1]}_prod.txt &) 
(sleep 10;jstack ${array[$2]} > jStack_${array[$2]}_prod.txt &) 

done 

Пожалуйста, помогите.

ответ

1

Используйте этот сценарий в BASH:

array=($(ps -ef | awk '/java/ && /tomcat|jboss|JBoss/{print $2}')) 
echo "${#array[@]}" 

EDIT: Если вы хотите запустить цикл вы можете сделать:

array=() 
while read -r p; do 
    echo "processing: $p" 
    array+=("$p") 
done < <(ps -ef | awk '/java/ && /tomcat|jboss|JBoss/{print $2}') 
echo "${#array[@]}" 
+0

Да, ваш код помогает мне получить длину массива. Но мне нужно использовать цикл for, поскольку мне нужно запустить некоторые другие команды внутри цикла for после получения длины массива. Пожалуйста, напишите мой отредактированный блок кода в моем исходном вопросе. – user3627319

+0

ok проверьте мой раздел ** EDIT ** для циклического прохождения различных результатов. – anubhava

0

Проблема со сценарием является то, что вы никогда не увеличивал индекс «N». Следующий сценарий может решить вашу проблему.

N=0 
for pid in $(ps -ef | grep java| egrep "tomcat|jboss|JBoss" | awk '{print $2}') ; 
do 
    array[$N]="$pid" 
    N=$((N + 1)) 

done 
echo "${#array[@]}" 
Смежные вопросы