KSH - 바이앰프(&&) 및 트윈튜브(||)를 사용하는 if/then/else

KSH - 바이앰프(&&) 및 트윈튜브(||)를 사용하는 if/then/else

if/then/else에 대한 모범 사례가 무엇인지 궁금합니다. (읽기가 더 쉽기 때문에) 다음 형식을 사용하는 경향이 있습니다.

#!/usr/bin/ksh
#

[[ -f /path/to/target/file ]] && {
    echo "File exists"
} || {
    echo "No such file"
}

이런 형태보다는

#!/usr/bin/ksh
#

if [ -f /path/to/target/file ] ; then
    echo "File exists"
else
    echo "No such file"
fi

또한 "else" 부분이 실행되지 않도록 복잡한 블록 true앞에 명령문을 추가했습니다 .} || {

어떤 제안이 있나요?

답변1

이 스타일의 문제점은 두 형식이 동일하지 않다는 것입니다. 당신이 사용할 때:

if command; then
    foo
else
    bar
fi

그러면 호출되거나 동시에 호출되지 않습니다 foo. 및 bar를 모두 사용하는 경우 두 가지 경로를 사용할 수 있습니다.&&||

$ [[ -d / ]] && {
> echo "Path 1 taken"
> false
> } || {
> echo "Path 2 taken"
> }
Path 1 taken
Path 2 taken
$

양식을 사용할 때 if cmd; then foo; else bar; fi호출 조건은 false를 반환하는 것입니다. 양식을 사용할 때 호출 조건은 false를 반환하는 것입니다.barcmdcmd && foo || barbarcmd && foo

true편집: 귀하의 질문에서 귀하의 버전이 작동하려면 블록 끝에 넣어야 한다고 인정하신 것으로 나타났습니다 . 이 작업을 수행할 의향이 있다면 다른 주요 문제는 모르겠습니다. 하지만 가능하다면 스타일 앞에 블록의 마지막 명령으로 무조건 "true"를 추가해야 할 것 같습니다. 명령이 실패할 수도 있습니다. 이는 단지 보장하기 위한 것입니다. 결국에는 잊어버리게 되며, 그렇지 않을 때까지 모든 것이 제대로 작동하는 것처럼 보일 것입니다.

답변2

제 생각에는 if-then-else가 다른 언어로 글을 쓰는 사람에게는 읽기 더 쉽습니다. 하지만 내 제안은
및 중 하나만 포함하는 단일 코드 줄에만 짧은 표기법(&& 또는 || 사용)을 사용하는 것입니다. 다음과 같은 일부 코드 &&||

[[ -d mustExist ]] || errorFunction "Dir mustExist is missing"
[[ -f toBeSend ]] && sendFile toBeSend
if [[ -d sometimes ]]; then
   writeTrueBlock
else
   writeFalseBlock
fi

편집: 새로운 아이디어: 이렇게 작성하는 것이 더 나을 수도 있습니다.

test -d mustExist || errorFunction "Dir mustExist is missing"
test -f toBeSend && sendFile toBeSend
if [[ -d sometimes ]]; then
   writeTrueBlock
else
   writeFalseBlock
fi

답변3

가독성과 스타일

나는 스크립팅에서 &&and 연산자를 많이 사용하는 경향이 있습니다.||

한 문장에 여러 개를 사용해 본 적도 있지만,계속하다현재 블록에서.

예시 1:

for word in $list; do
    condition1 $word || continue
    condition2 $word || continue

    : do stuff with $word
    : do more stuff with $word
done

조건 1그리고조건 2주장으로. 우리는 예외를 얻었다 비켜서 다을 클릭하고 이 코드가 수행해야 하는 작업을 계속합니다.

if사용하기가 좀 어색하네요 ... 이런 상황에서는 요 then.fi

대체 기호:

예 2:

for word in $list; do
    if condition1 $word && condition2 $word; then
        : do stuff with $word
        : do more stuff with $word
    fi
done

존재하다실시예 2추가 작업 없이 다른 수준의 들여쓰기가 가능합니다.

예시 3:

for word in $list; do
    condition1 $word && condition2 $word || continue
    : do stuff with $word
    : do more stuff with $word
done

두 조건을 간단하게 표현하면 예시 3처럼 결합하기도 합니다.


추신: 원래 쉘 프로그래머를 위한 연습을 추가했습니다.세 가지 예 중 두 가지만 완전히 동일합니다. 어느 것이 이상한가요? 공교롭게도 내가 존재한다고 생각했던 차이점은 존재하지 않았습니다. 사실 하나 썼는데shpec시험:

describe "continue"
  it "discards last exit status"
    (for i in 1; do
     false || continue
     done
    )
    assert equal 0 $?
  end
end

shpec/continue_shpec.sh
continue
  discards last exit status
  1 examples, 0 failures

관련 정보