Вы могли бы также использовать арифметику для цикла как это:
a=(user1 pass1 user2 pass2)
for ((i=0; i<${#a[@]}; i+=2)); do
echo "${a[i]}: ${a[i+1]}"
done
Символ &
запускает фоновый процесс. Фоновый процесс выполняется асинхронно в подоболочке. Переменные можно передавать из родительской оболочки в подчиненную оболочку, а не наоборот. Однако вы можете найти обходной путь, если вам действительно нужно значение, установленное в дочерней оболочке:
boolean=$(mktemp) && echo "false" >$boolean
{ sleep 5 && echo true >$boolean && echo "boolean is true now" ; } &
{ until [ "$(cat $boolean)" = "true" ] ; do sleep 1 && cat $boolean ; done ; } &&
echo "boolean is true now: $(cat $boolean)"
Это создает временный файл, содержимое которого является логическим значением. В цикле до
этот файл проверяется до тех пор, пока он не станет истинным.
Примечание:
Я рекомендую сделать следующее в вашем скрипте (если возможно):
{ sleep 5 && echo "background process done" ; } &
wait
echo "continue in foregound."
wait
ожидает завершения фонового процесса.
Для связи между основной и фоновой оболочками можно использовать сигналы:
#!/bin/bash
# global variable for foreground shell
boolean=false
# register a signal handler for SIGUSR1
trap handler USR1
# the handler sets the global variable
handler() { boolean=true; }
echo "before: $boolean"
# Here, "$$" is the pid of the foreground shell
{ sleep 5; kill -USR1 $$; echo "finished background process"; } &
# busy waiting
until $boolean; do
echo "waiting..."
sleep 1
done
echo "after: $boolean"
output
before: false
waiting...
waiting...
waiting...
waiting...
waiting...
finished background process
after: true
Вы ошибочно предполагаете, что логическое значение
, которое вы установили в true во второй строке, является тем же логическим, которое вы проверяете в до выписки
. Это не тот случай, вы запускаете новый процесс с новой оболочкой в фоновом режиме и логическим
(тот, который вы проверяете), никогда не назначается.