В bash, как установить код возврата?

Я хочу установить возвращаемое значение один раз, чтобы он вошел в цикл while:

#!/bin/bash
while [ $? -eq 1 ]
do
#do something until it returns 0    
done

чтобы получить эту работу, мне нужно установить $? = 1 в начале, но это не работает.

8 ответов


#!/bin/bash

RC=1

while [ $RC -eq 1 ]
do

  #do something until it returns 0    

  RC=$?
done

вы можете установить произвольный код выхода на выполнении 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