셸 조건 &&, || 뒤에 여러 명령이 나열됩니다. 쉘 스크립트, 대시

셸 조건 &&, || 뒤에 여러 명령이 나열됩니다. 쉘 스크립트, 대시

다음과 같은 조건 후에 여러 명령을 실행하려고 합니다.

[ $VAR ] || echo "Error msg" ; echo "exit"

그리고 역

[ -z $VAR ] &&  echo "Error msg" ; echo "exit"

예상대로 작동하지 않을 것이라는 것을 알고 있습니다. 실제로 이전에 수행하는 방법을 알고 있었지만 수행하는 방법을 잊어버렸습니다. 나는 if'를 사용하거나 ()and를 통해 묶는 것과 같은 많은 대안을 완전히 알고 있습니다 {}. 를 사용하면 ()실행 중인 스크립트를 종료하지 않는 하위 프로세스가 생성됩니다. 를 사용하면 {}작동하지만 더 읽기 쉬운 대안이 존재한다는 것을 알고 있습니다.

나는 이것을 사용했고 :완벽합니다! 지금은 전혀 기억나지 않고, 제가 쓴 대본도 잃어버렸어요.

이 글을 어떻게 쓰는지 아시는 분 계시면 :도움을 주시면 정말 감사하겠습니다!

답변1

더 읽기 쉬운 대안은 다음과 같습니다.

if [ -z "$VAR" ]; then
  echo "Error msg" 1>&2
  exit 1
fi

나는 그것이 당신이 찾고 있는 것이 아니라는 것을 알고 있습니다. 하지만 이건 써야 합니다. 여기서 &&and 의 사용은 ||약간 신비스럽습니다. 나는 당신이 무엇을 기억하고 있는지(혹은 잘못 기억하고 있는지)는 모르지만, 그것이 무엇이든, 여기 아무도 그것이 무엇인지 추측할 수 없다면, 그것은 확실히 "읽을 수 있는" 자격이 없습니다.

그런데 주변 인용문을 참고하시기 바랍니다 $VAR.변수 대체에는 항상 큰따옴표를 사용하세요., 따옴표를 생략해야 하는 이유와 그렇게 하는 것이 안전한 이유를 알지 못하는 경우. ( 안에 따옴표를 넣을 필요는 없지만 [[ … ]], 안에는 따옴표를 넣어야 합니다 [ … ].)

eval명령을 그룹화하는 교활한 방법이지만 사용하기가 쉽지 않습니다.

다른 명령에서 출력을 생성하는 또 다른 방법은 명령 대체에서 수행하는 것입니다. 이번에도 읽을 수 없습니다.

[ "$VAR" ] || exit 1$(echo "error message" >&2)

특정 형태의 그룹화 구성(중괄호 또는 //또는/if/thenfiwhiledodone

답변2

나는 매우 읽기 쉬운 다음과 같은 것을 사용하는 경향이 있습니다.

[ -z "$VAR" ] && {
  echo "Line $LINENO: Error msg"
  exit 1
} >&2

의 경우 :내가 상상할 수 있는 유일한 것은 어떤 방식으로 함수를 정의하는 것인데, 이를 여러 명령을 실행할 수 있는 블록으로 변환하는 방법을 모르겠습니다.

~에서man bash:

: [arguments]
        No effect; the command does nothing beyond expanding arguments and
        performing any specified redirections. A zero exit code is returned.

:그래서 나는 그것을 다른 것으로 재정의하는 것이 유일한 가능성이라고 생각합니다 . 나는 이것이 무엇인지 알고 싶습니다.

어쨌든, 따옴표 없이 이러한 매개변수를 확장하는 것은 의미가 없습니다. 특히 [ -zif [ -z $VAR ]가 비어 있는 경우(또는 기본값인 공백, 탭 및 줄 바꿈만 포함하는 경우)[ -z ]$VAR$IFS[ -z 빈 문자열 ]는 의 약어이므로 true를 반환합니다 [ -n "-z" ].

또한 $LINENO종료 코드를 사용하는 것은 좋지 않은 생각입니다. 0부터 255까지의 숫자만 지원되고(다른 쉘은 해당 범위 밖의 값에 대해 다르게 동작함) 일부는 특별한 의미를 갖기 때문입니다.

답변3

여러 가지 옵션 중 어느 것도 실제로 적합하지 않음

  1. ${VAR:?"Error msg"}
  2. eval "${VAR:-echo Error msg; exit}"
  3. 산술 평가는 삼항 표현식을 지원하지만 값에 대해서만 지원됩니다. 이것이 귀하의 사용 사례에 얼마나 유용한지 모르겠습니다.unset -v a; (( VAR != 0 ? (a=20) : (a=3) )) ; echo $a

답변4

나는 당신이 실제로 당신이 말한 것을 찾고 있다고 생각하지 않을 수 없습니다. 그렇지 않습니까?

[[ -z "$temp" ]] && { echo nope; continue; }

관련 정보