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를 반환하는 것입니다.bar
cmd
cmd && foo || bar
bar
cmd && 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