![왜 "do"를 "for"와 같은 줄에 넣어야 하나요?](https://linux55.com/image/133255/%EC%99%9C%20%22do%22%EB%A5%BC%20%22for%22%EC%99%80%20%EA%B0%99%EC%9D%80%20%EC%A4%84%EC%97%90%20%EB%84%A3%EC%96%B4%EC%95%BC%20%ED%95%98%EB%82%98%EC%9A%94%3F.png)
1. 요약
왜 필요한지 이해가 안 돼요E010 바바트 규칙.
2. 세부사항
나는 사용한다백샷파일을 확인하는 데 사용됩니다 .sh
. E010 규칙:
하다같은 줄에 있지 않아~을 위한
for
백샷:
옳은:
#!/bin/bash for f in bash/*.sh; do sashacommand "$f" done
실수:
#!/bin/bash for f in bash/*.sh do sashacommand "$f" done
내가 왜 같은 입장에 있어야 하는지에 대한 for
타당한 주장이 있습니까 ?do
3. 쓸모없다
다음 페이지에서 내 질문에 대한 답변을 찾을 수 없습니다.
- 최고의 코딩 방법에 대한 기사(예)
bashate 문서. 내가 찾은오직:
제어 블록 내에서 일관성을 유지하는 데 도움이 되는 일련의 규칙입니다. 펼치는 것이 약간 "재미" 있기 때문에 연속되는 긴 줄에서는 무시됩니다.
답변1
구문적으로 다음 두 코드 조각은 정확하고 동일합니다.
for f in bash/*.sh; do
sashacommand "$f"
done
for f in bash/*.sh
do sashacommand "$f"
done
후자는 할 수 있다가능한do
루프 본문 내의 명령을 약간 난독화하기 때문에 읽기가 더 어렵다고 합니다 . 루프에 여러 명령이 포함되어 있고 다음 명령이 새 줄에 있으면 혼란이 더욱 강조됩니다.
for f in *
do cmd1
cmd2
done
...하지만 "오류"라고 표시하는 것은 객관적인 사실이 아니라 누군가의 개인적인 의견입니다.
내가 말하려는 것은 루프에 명령을 추가하려는 경우 do
코드를 읽는 사람의 눈에 일관되고 읽기 쉬운 코드를 만드는 한 자유롭게 그렇게 할 수 있다는 것입니다.
일반적으로 거의 모든 것을 ;
개행 문자로 대체할 수 있습니다. 개행 문자는 ;
모두 명령 종결자입니다. "(이 루프 do
에서) 수행해야 할 작업은 다음과 같습니다"를 의미하는 키워드입니다 .for
for f in *; do ...; done
동일합니까?
for f in *
do
...
done
그리고
for f in *; do
...
done
그리고
for f in *
do ...
done
둘 중 하나를 사용하는 이유는 가독성과 지역/개인 스타일 규칙 때문입니다.
개인적인 생각:
루프 헤더 내매우 긴do
, 나는 다음과 같은 새로운 줄을 추가하는 것이 합리적이라고 생각했습니다 .
for i in animals people houses thoughts basketballs bees
do
...
done
또는
for i in \
animals \
people \
houses \
thoughts \
basketballs \
bees
do
...
done
then
진술도 마찬가지다 if
.
그러나 이는 개인의 스타일 선호도나 팀/프로젝트가 사용하는 코딩 스타일에 따라 달라집니다.
답변2
페이지 상단의 내용을 참고하세요.
bashate: bash 스크립트와 동등한 pep8
PEP8Python 코딩 스타일 가이드입니다. Python 사람들은 종종 자신의 스타일 문제를 매우 심각하게 받아들이는 것 같습니다.[인용 필요], 더 이상은 가이드가 아닙니다. do
and 를 같은 줄에 두거나 for
별도의 줄에 두는 것의 몇 가지 이점을 생각해 낼 수 있습니다 .
이는 또는 블록(또는 유사한 블록)을 시작할 {
때 C 코드를 어디에 배치할지에 대한 논의와 동일합니다 .if
while
문서의 몇 줄 아래에 또 다른 흥미로운 규칙이 있습니다.
E020: 함수 선언이 형식을 따르지 않습니다.
^function name {$
function
여기서 요점은 이 스타일 가이드의 저자가 독자가 함수 선언을 식별하려면 키워드 사용이 필요하다고 믿는다는 것입니다 . 그러나 function foo
그것은비표준함수 정의 방식: 표준 방식은 입니다 foo()
. Bash에서 둘 사이의 유일한 차이점은 다른 하나는 /bin/sh
Debian이나 Ubuntu와 같은 표준 셸로 이식하기가 더 어렵다는 것입니다.
그러므로 나는 이러한 모든 스타일 가이드를 참고하여 가장 좋은 스타일이 무엇인지 스스로 결정하는 것이 좋습니다. 좋은 스타일 검사기를 사용하면 일부 검사를 비활성화할 수 있습니다(bashate는 bashate -i E010,E011
이 두 검사를 무시해야 합니다.). 좋은 스타일 검사기를 사용하면 여기에서 E020의 반대 검사와 같은 테스트를 수정할 수 있습니다.
답변3
요약: 그럴 필요는 없습니다. 그건 한 남자의 의견일 뿐이에요.
for
다른 많은 사람들과 마찬가지로 나도 수십 년 동안 다음과 같은 루프를 작성해 왔습니다 .
for F in arg1 arg2 arg*
do
somecommand "$F"
done
이 레이아웃은 C와 유사한 언어의 중괄호처럼 루프 본문이 중괄호로 둘러싸여 있다는 사실을 강조하며 do ... done
개행을 통해 루프 구성 요소를 구분할 수 있습니다.
물론, 교정기를 어디에 놓을 것인가를 놓고 종교적인 전쟁도 있기 때문에 배심원단은 아직 이 부분에 대해 결정을 내리지 못했다고 말할 수도 있습니다. IMHO, Bourne은 구분 기호 일치를 좋아하는 것이 분명합니다. if ... fi
, case ... esac
, 그리고 더 짧은 버전에 세미콜론을 요구한다는 것은 원래 디자인보다 더 짧게 만들었다는 것을 의미합니다. 잘못된 것은 없습니다. 기술은 발전했으며 한때 좋은 아이디어처럼 보였던 많은 것들이 이제는 승인되지 않습니다 goto
. 그러나 전체 쉘 스크립팅 커뮤니티가 작성자의 선호 사항을 채택할 때까지는 bashate
아무 것도 할 필요가 없습니다 .
답변4
아직 아무도 이 효율적이고 이식 가능한 구문을 언급하지 않았다는 사실에 놀랐습니다.
set alfa bravo charlie
for q do
echo "$q"
done
for
와 은 do
같은 줄에 있고 세미콜론이 없다는 점에 주의하세요 . 결과:
alfa
bravo
charlie