Bash의 조건부에서 "아무것도하지 않는다"는 것은 어떤 명령입니까?


180

때로는 조건을 만들 때 아무 것도하지 않는 코드가 필요합니다. 예를 들어, 여기서 $a"10"보다 큰 경우 Bash가 아무 것도하지 않기를 원합니다. $a"5"보다 작은 경우 "1"을 인쇄하고, 그렇지 않으면 "2"를 인쇄하십시오.

if [ "$a" -ge 10 ]
then
elif [ "$a" -le 5 ]
then
    echo "1"
else
    echo "2"
fi

그래도 오류가 발생합니다. 아무것도하지 않고 스크립트 속도를 늦추지 않는 명령이 있습니까?

답변:


340

쉘에서 no-op 명령은 :(콜론)입니다.

if [ "$a" -ge 10 ]
then
    :
elif [ "$a" -le 5 ]
then
    echo "1"
else
    echo "2"
fi

로부터 bash는 설명서 :

:(콜론)
인수를 확장하고 리디렉션을 수행하는 것 외에는 아무것도하지 마십시오. 반환 상태는 0입니다.


3
@SaintHax 아니요, 실행되지 않습니다 true. 그것은 껍질에 내장되어 있으며 아무것도하지 않습니다.
Barmar

1
그것은 쉘에 내장되어 있으며 (정확합니다) true와 마찬가지로 true (상태 0)를 반환하며 읽기가 더 어렵습니다. Bash는 DevOps 언어이며 :팀의 누군가가 작성한 경우 언어를 변경해야합니다.
SaintHax

3
@SaintHax 누군가가 무조건적인 true맥락에서 사용한다면 , 나는 그것들을 바꾸게 할 것입니다. if true괜찮아요, then true잘못된 것 같습니다.
Barmar

1
물론, if ! condition; then do something; fi대신 사용할 코드를 간단히 다시 작성할 수 있습니다 if condition; then :; else do something; fi.
Barmar

동의합니다. 이 예제는 복합 조건을 사용하여 if / elif / else로 작성 될 수 있으며 더 좋습니다.
SaintHax

38

아마도 다음 true명령을 사용할 수 있습니다 .

if [ "$a" -ge 10 ]; then
    true
elif [ "$a" -le 5 ]; then
    echo "1"
else
    echo "2"
fi

대안으로, 귀하의 예제 경우 (그러나 반드시 모든 곳은 아님) if / else를 다시 주문하는 것입니다.

if [ "$a" -le 5 ]; then
    echo "1"
elif [ "$a" -lt 10 ]; then
    echo "2"
fi

8
당신은 결과를 테스트 모두없는 경우 truefalse효과적으로까지 스크립트에 관한 한 어떠한 작전 없지만, 원칙적으로 그들은 그래서 아마도이 구문을 받아 일부 포탄에 포크 :낫다.
dmckee --- 전 운영자 고양이

3
질문에는 bash 태그가 붙어 있습니다. bash에서 내장 true되어 false있습니다. 구형 쉘의 경우, true, false, 심지어 :외부 명령 수 있습니다 (당신은 아마 단지 후자 볼 수있을 거라고하지만 아주 오래된 껍질).
Keith Thompson

6
나는 :의도가 무엇인지 더 명확하기 때문에 단순히 선호합니다
Freedom_Ben

9

no-op 명령과 관련하여 원래의 질문에 대답하지는 않지만 " 이 지점에서 아무 것도 할 필요가 없다 "고 생각할 수있는 많은 (대부분은 아니지만) 문제 는 단순히이 지점을 도록 논리재구성하여 우회 할 수 있습니다. 발생하지 않습니다.

OPs 예제를 사용하여 일반적인 규칙을 제시하려고합니다.

$ a가 "10"보다 크면 아무 것도하지 말고 $ a가 "5"보다 작 으면 "1"을 인쇄하고, 그렇지 않으면 "2"를 인쇄하십시오

우리는 일반적인 조건이 조건에 따라 서로에게 적용될 수 $a있기 때문에 10을 초과 하는 지점을 피해야합니다 $a < 10.

일반적으로 X때 아무 것도 말하지 않으면 X가 있는 지점피하기 위해 문구 를 바꾸십시오 . 일반적으로 X를 무시하고 다른 모든 조건에 적용하여 회피를 수행 할 수 있습니다.

따라서 규칙이 적용된 OP 예제는 다음과 같이 재구성 될 수 있습니다.

if [ "$a" -lt 10 ] && [ "$a" -le 5 ]
then
    echo "1"
elif [ "$a" -lt 10 ]
then
    echo "2"
fi

$a < 10조건의 모든 것을 묶는 위의 변형 일뿐입니다 .

if [ "$a" -lt 10 ]
then
    if [ "$a" -le 5 ]
    then
        echo "1"
    else
        echo "2"
    fi
fi

(이 특정 예제의 경우 @Flimzys 구조 조정 이 더 낫지 만 모든 사람들이 아무것도하지 않는 방법을 검색하는 일반적인 규칙을 부여하고 싶었습니다.)


5
누군가가 무의식적으로 행동하기를 원할 수있는 한 가지 이유는 부주의 한 부작용없이 "나중에 여기에 무언가를 추가 할 것"이라는 생각으로 코드를 처음 구성 할 때입니다. 예를 들어 if.then-else-fi를 .bashrc에 넣으면 echo "put stuff here"로그인하지 않은 일부 사용이 중단되고 (예 : scp가 손상됨) 공백 / 설명만으로 런타임 오류가 발생합니다.
Aphoid
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.