bash 스크립트를 작성할 때 &&와 동등한 것은 무엇입니까?


31

중복 된 질문 인 경우 사전에 사과드립니다. 여기에 묻기 전에 검색 / 확인하려고 노력했습니다.

나는 다음과 같이 한 줄짜리를 작성하는 것이 편안합니다.

foocommand && foocommand2 && foocommand3

아이디어는 이전 명령이 "성공"인 경우 후속 명령 만 실행하려는 것입니다.

나는 다소 긴 스크립트를 작성 중이며이 하나의 라이너는 다른 모든 사람에게 혼란스러운 코드 블록처럼 보이기 때문에 실현 가능하지 않습니다.

명령의 간격을두고 스크립트 사이에 주석을 작성하고 싶습니다. 이 작업을 어떻게 수행하고 거기에 &&와 동일한 기능이 있습니까?


4
이 곰 반복은 : &&이전의 경우 다음 명령이 실행 의미하지 않는 성공했다. 이는 명령 목록에있는 모든 이전 명령 의 전체 결과 가 성공한 경우 명령이 실행됨을 의미합니다 . 당신은 이것을 알고 있을지 모르지만, 미래 독자들은 오해 할 것입니다.
kojiro

1
그냥 참고로 또한, 당신이를 설명하고이 동작에서 유래 ||&&(반대 |또는 &단락이라고합니다). 후자의 연산자와 함께 사용되는 동작을 열성 평가라고합니다.
AndyPerfect

7
@ kojiro : 나는 구별을 볼 수 없습니다. a && b && c만 실행 b하면 a성공, 그래서 "만 실행하는 c경우 b"에만 실행 및 성공 " c경우 ab: 해당 문 둘 것은 성공" b하지 않으면 성공할 수 없다 a성공했다.
ruakh

1
@ruakh a || b && c가 더 예시 적입니다.
kojiro

8
@ruakh 아니오, true || false && echo hi출력 hi합니다. 스펙은 "&&"및 "||"연산자를
kojiro

답변:


23

다음과 같이 할 수 있습니다 :

#!/bin/sh
ls -lh &&
    # This is a comment
    echo 'Wicked, it works!'

나는 당신이 올바르게 요구 한 것을 이해하기를 바랍니다.


감사. 이것은 내가하고 싶었던 것에 가장 가깝습니다. 필요한 경우 하나의 라이너로 쉽게 변환 할 수 있습니다.
Mike B

Mike는 코드 청결에 대해 우려하고 있기 때문에 일반적인 규칙은 첫 번째 체인 아래의 2-N 섹션을 들여 쓰는 것입니다.
jblaine

@jblaine 나는 당신이 무슨 뜻인지 잘 모르겠습니다. 자세히 설명해 주시겠습니까?
Mike B

Mike, Stackexchange에서 내 답변의 형식을 올바르게 지정할 수 없으므로 여기에 의미가있는 모든 것이 있습니다. indent
jblaine

@jblaine 좋은 점, 줄을 들여 쓰도록 편집되었습니다.
Volker Siegel

38

shebang 라인을 다음으로 변경할 수 있습니다

#!/bin/bash -e

오류가 발생하면 스크립트가 중지됩니다.


1
흥미 롭군 나는 그것을 명심할 것이다. 고맙습니다.
Mike B

필요할 때 set -e를 입력하지 않아도됩니다
Silverrocker

@Silverrocker POSIX이기도합니다 ( bash물론 일부 제외 ). POSIX 셸에는 적용 가능한 여러 가지 옵션이 있습니다 set. 혹은 그 반대로도? set스크립트 내에서 쉘 명령 행 옵션을 설정하는 방법입니다.
Kaz

7
불행히도, 일반적인 종료 상태 규칙을 따르지 않는 여러 표준 유틸리티가 있으므로 -e오작동 할 수 있습니다. 예를 들어, diff두 개의 동일하지 않은 파일이있을 때마다 스크립트가 종료되는 것을 원하지 않을 수 있습니다. 물론 이러한 명령에 || true(또는 || [ $? = 1 ])를 추가하여이 문제를 해결할 수 있지만 OP는이 스크립트를 읽어야하는 "다른 사람"이라고 언급하고 "다른 사람"은 에 대처하십시오 -e.
ruakh

4
나는 -e회사의 한 관리자가와 함께 내 스크립트를 계속 실행할 때까지 she-bang을 사용 bash myscript.sh했으므로를 무시했습니다 -e. 이제 모든 스크립트에는 set -e두 번째 줄이 있습니다.
Carlos Campderrós

19

set -e아이디어 가 마음에 들지 않으면 논리를 뒤집을 수 있습니다.

foocommand || exit 1
foocommand2 || exit 2
foocommand3 || exit 3

exit유용한 것은 유용한 오류 메시지를 인쇄하기 위해 다른 것으로 바꾸고 종료하십시오. 물론 함수 내부에서는 return대신에 원합니다 exit.


11
또는 foocommand || exit와 출구 foocommand영이 아닌 경우의 종료 상태.
Stéphane Chazelas

이것은 어떻게 작동합니까? C에서와 비슷합니까? 왼쪽 인수가 TRUE로 평가되면 더 이상 인수를 검사하지 않습니까?
Vorac

네 맞습니다. Lisp (및 기능적인 언어, 일반적으로 생각합니다)와 Perl의 일반적인 관용구입니다.
tripleee

9

if else fi대신 블록을 사용할 수 있습니다 .

if foocommand; then

  # some comments

  if foocommand2; then

    # more comments

    foocommand3
  fi
fi

좀 더 읽기 쉽습니다.

또는 \큰 1 라이너를 여러 줄로 나눌 때 사용할 수 있습니다

foocommand && \
  # some comment
  foocommand2 && \
    # more comment
    foocommand3

그러나 이것은 훈련되지 않은 눈에 혼란을 줄 수 있습니다.


4
나는 그것이 필요하다고 생각하지 않습니다 \.
사무엘 에드윈 워드 1

네 말이 맞아 습관의 힘.
Martín Canaval

5

중첩 if명령문 사용을 고려할 수 있습니다. 다른 옵션은 곱슬을 사용하여 그룹화하는 것입니다.{ true && echo hi; } || echo huh

업데이트 1 :

개행 / 코멘트가없는 예는 다음과 같습니다.

{ { false && echo "inner true"; } && { echo "inner true" && true; } || { echo "inner false" && false; } || echo "outter false"; }

@Stephane 세미콜론을 추가해 주셔서 감사합니다. 전화를 사용하여 답장을 보냈으므로 답변을 두 번 확인하지 않았습니다. :)
livingstaccato

재미있는 생각. 예, 중첩 된 if 문을 생각했지만 많은 것들을 함께 묶으면 지저분해질 수 있습니다.
Mike B

4

각 명령 시퀀스를 함수로 분할하십시오.

big_block_1() {
  # ...
}
big_block_2() {
  # ...
}
big_block_3() {
  # ...
}

big_block_1 && big_block_2 && big_block_3

0

저는 항상 "실패"기능을 작성하여 오류가 발생했을 때 수행 할 작업을 지정한 다음 ||패턴 을 사용할 수 있습니다 . 다음과 같이 :

function fail() {
  echo "Failure: ${@}"
  exit 1
}

foocommand || fail "couldn't foo"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.