Прежде всего Вы не должны использовать $(echo $FRUITS)
в for
оператор. Используя просто $FRUITS
достаточно. Затем можно покончить с одной из строк в цикле, при помощи eval
.
eval
просто говорит удару делать вторую оценку следующего утверждения (т.е. еще один, чем его нормальная оценка). \$
переживает первую оценку как $
, и следующая оценка затем рассматривает это $
как запуск имени переменной, которое решает к "Желтому" и т.д.
Таким образом, у Вас не должно быть отдельного шага, который делает временную строку (который является тем, чему я верю, было основное намерение Вашего вопроса).
for fruit in $FRUITS ;do
eval echo $fruit is \$${fruit}_COLOUR
done
Для альтернативного метода, как упомянуто Patrick в комментарии (выше), можно вместо этого использовать ассоциативный массив, в котором индекс элемента не должен быть целым числом. Можно использовать строку, такую как название типа фруктов. Вот пример, с помощью ассоциативного массива удара:
# This declares an associative array (It unsets it if it already exists)
declare -A colour
colour['BANANA']="Yellow"
colour["APPLE"]="Green or Red"
colour[MARTIAN ORANGE]="Blue"
for fruit in BANANA APPLE "MARTIAN ORANGE" ;do
echo "$fruit" is "${colour[$fruit]}"
done
Можно сделать это, например, с:
OLDEST_PID=$(pgrep -o 'DELETE OPERATION_CONTEXT')
test $OLDEST_PID && pgrep 'DELETE OPERATION_CONTEXT' | grep -vw $OLDEST_PID | xargs -r kill
Первая строка находит самый старый PID. Вторая строка проверяет сначала если $OLDEST_PID
содержит что-то. Если да, это перечисляет все процессы соответствия, фильтры $OLDEST_PID
и уничтожьте их (если кто-либо остается).
Лучший путь состоит в том, чтобы избежать дублированных процессов путем добавления lockfiles к сценарию крона как в этом вопросе.
Ниже Примера процесса apache2 это уничтожит весь PID кроме сначала один
pgrep apache2 |awk 'NR >= 2' | xargs -n1 echo kill
если вывод вышеупомянутой команды выглядит хорошо, то можно удалить echo
можно испытать это:
ps -e --sort=start -o start,pid,cmd|grep <cmd>|egrep -v grep |sed 1d
это даст Вам следующий отформатированный вывод:
время начала, PID, выполняемая команда
for i in `ps -e --sort=start -o start,pid,cmd|grep <cmd>|egrep -v grep |sed 1d`
do
kill -9 $i
done
замените уничтожение эхом сначала, чтобы гарантировать, что оно уничтожит новостей.
если у вас есть java crons и вы хотите проверить перед запуском этого cron, попробуйте следующее: System.out.println ("Проверка предыдущих сеансов для этого cron:" + cronname);
String proname=ManagementFactory.getRuntimeMXBean().getName();
String pid=proname.split("@")[0];
System.out.println("Current PID:"+pid);
Process proc = Runtime.getRuntime().exec(new String[]{"bash","-c"," ps aux | grep "+cronname+" | awk '{print $2}' "});
BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String s = null;
String killid="";
while ((s = stdInput.readLine()) != null ) {
if(s.equals(pid)==false)
{
killid=killid+s+" ";
}
}
System.out.println("Running PID'S except current:"+killid);
proc.waitFor();
Process proc1 = Runtime.getRuntime().exec(new String[]{"bash","-c","kill -9 "+killid});
proc1.waitFor();
System.out.println("Previous duplicate sessions closed for: "+cronname);
pass cronname как ur cronname.jar