Двойное Переменное Расширение Из Для Цикла - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь выяснить, как определить переменные в цикле for.Они должны равняться значениям предопределенных переменных, причем переменная цикла for является частью этих предопределенных имен переменных.

Пример:

PROCESS1="sshd"    --> 1 will be a for loop variable 'i' value
ALIAS1=SSH
PROCESS2="snmpd"   --> 2 will be a for loop variable 'i' value
ALIAS2=SNMP

#Creating array consisting of n number of processes to feed to the for loop

ARRAY=(1 2)

for i in ${ARRAY[@]]};do
PID$i=`ps -elf | grep -i $PROCESS$i`  -->   this is where I am getting stuck
TCP$i=`netstat -anlp | grep $PID$i
done

Я пытаюсь создать PID1 равнымк значению вывода команды "ps" с подстановкой для значения переменной PROCESS1.

Я даже пробовал это:

for i in ${ARRAY[@]]};do

PROCESS=PROCESS$i
ALIAS=ALIASP$i
PID=PID$i

PID$i=`ps -elf | grep -i $$PROCESS`
TCP$i=`netstat -anlp | grep $$PID

Это только попытка grep для "PROCESS1"вместо sshd.

1 Ответ

0 голосов
/ 21 мая 2018

Почему бы вам просто не использовать bash-массивы?:

PROCESS=(sshd snmpd)
for i in $(seq 0 $((${#PROCESS[@]}-1)));do
    PID[$i]=$(pgrep "${PROCESS[$i]}")
    TCP[$i]=$(netstat -anlp | grep ${PID[$i]})
done
echo ${#PID[0]} ${#TCP[0]} ${#PID[1]} ${#TCP[1]}

Использовать bash-ассоциативные массивы для развлечения:

PROCESS=(sshd snmpd)
declare -A PID TCP
for i in ${PROCESS[@]};do
    PID[$i]=$(pgrep "$i")
    TCP[$i]=$(netstat -anlp | grep ${PID[$i]})
done
echo ${#PID[sshd]} ${#TCP[sshd]} ${#PID[snmpd]} ${#TCP[snmpd]}

Использовать объявить, получить значение переменной с помощью косвенной ссылки, еслиВы должны:

PROCESS=(sshd snmpd)
for i in $(seq 0 $((${#PROCESS[@]}-1)));do
    declare PID$i="$(pgrep "${PROCESS[$i]}")"
    ref=PID$i
    declare TCP$i="$(netstat -anlp | grep ${!ref})"
done
echo ${#PID0} ${#TCP0} ${#PID1} ${#TCP1}

Никогда не используйте eval:

PROCESS=(sshd snmpd)
for i in $(seq 0 $((${#PROCESS[@]}-1)));do
    eval "PID$i=\"$(pgrep "${PROCESS[$i]}")\""
    eval "TCP$i=\"\$(netstat -anlp | grep \$PID$i)\""
done
echo ${#PID0} ${#TCP0} ${#PID1} ${#TCP1}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...