В bash, как установить код возврата?
Я хочу установить возвращаемое значение один раз, чтобы он вошел в цикл while:
#!/bin/bash
while [ $? -eq 1 ]
do
#do something until it returns 0
done
чтобы получить эту работу, мне нужно установить $? = 1
в начале, но это не работает.
8 ответов
вы можете установить произвольный код выхода на выполнении exit
С аргументом в подоболочку.
$ (exit 42); echo "$?"
42
так что вы могли бы сделать:
(exit 1) # or some other value > 0 or use false as others have suggested
while (($?))
do
# do something until it returns 0
done
или эмулировать do while
цикл:
while
# do some stuff
# do some more stuff
# do something until it returns 0
do
continue # just let the body of the while be a no-op
done
любой из них гарантирует, что цикл запускается по крайней мере один раз, который я считаю, что ваша цель.
false
всегда возвращает код выхода 1.
#!/bin/bash
false
while [ $? -eq 1 ]
do
#do something until it returns 0
done
некоторые ответы зависят от перезаписи кода. В некоторых случаях это может быть иностранный код, над которым у вас нет контроля.
хотя для этого конкретного вопроса достаточно установить $? к 1, но если вам нужно установить $? к любой ценности-единственный полезный ответ - тот, что от Денниса Уильямсона.
немного более эффективный подход, который не порождает нового ребенка (но также менее лаконичен), является:
function false() { echo "$$"; return ${1:-1}; }
false 42
Примечание: часть Эха есть только для проверки выполняется в текущем процессе.
Я думаю, вы можете сделать это неявно, выполнив команду, которая гарантированно завершится неудачей, перед вводом while
петли.
каноническая такая команда, конечно,false
.
было бы что-то вроде этого, что вы ищете ?
#!/bin/bash
TEMPVAR=1
while [ $TEMPVAR -eq 1 ]
do
#do something until it returns 0
#construct the logic which will cause TEMPVAR to be set 0 then check for it in the
#if statement
if [ yourcodehere ]; then
$TEMPVAR=0
fi
done
старый вопрос, но есть гораздо лучший ответ:
#!/bin/bash
until
#do something until it returns success
do
:;
done
Если вы зацикливаетесь, пока что-то не будет успешным, тогда просто сделайте это что-то в разделе до. Вы можете поместить точно такой же код в раздел "Пока", который вы думали, что должны были поместить в раздел "сделать/сделать". Вы не обязаны писать код в разделе do/done, а затем передавать его результаты обратно в while или until.
можно использовать until
для обработки случаев, когда #do something until it returns 0
возвращает что-то другое, чем 1 или 0:
#!/bin/bash
false
until [ $? -eq 0 ]
do
#do something until it returns 0
done