grep이 0 값을 찾으면 상태 1로 종료됩니다.

grep이 0 값을 찾으면 상태 1로 종료됩니다.

아래는 내 코드입니다

1_week=$(git log --since=$(date +"%Y-%m-%d" --date="@$(($(date +%s) - 604800))")|grep '^commit ' |wc -l) && 2_week=$(git log --since=$(date +"%Y-%m-%d" --date="@$(($(date +%s) - 604800))")|grep '^Author:' |sort -u|wc -l)

실수:

+ let '1_last_week += 0'
/home/mytestshell.sh exited with return code 1

아래에 이 내용을 인용하려고 합니다.https://blog.m157q.tw/posts/2021/06/09/be-careful-when-using-grep-on-circleci/

1_week=$(git log --since=$(date +"%Y-%m-%d" --date="@$(($(date +%s) - 604800))")|grep '^commit ' || true |wc -l) && 2_week=$(git log --since=$(date +"%Y-%m-%d" --date="@$(($(date +%s) - 604800))")|grep '^Author:' || true |sort -u|wc -l)

하지만 발견된 값이 0이면 여전히 1번 출구 오류가 발생합니다. 여기서 누락된 부분이 무엇인지 안내해 줄 수 있는 사람이 있나요?

인사,

답변1

이것이 어떤 쉘에 대해 작성되었는지는 밝히지 않았지만 일반적으로 변수 이름은 숫자로 시작할 수 없습니다.

코드를 붙여넣기 시작하는 것이 좋습니다.https://shellcheck.net(또는 shellcheck로컬로 설치). 이는 당신이 직접 해결할 수 있는 많은 문제를 발견하는 데 도움이 될 것입니다.

당신의 스타일도 개선의 혜택을 누릴 것입니다. 길고 조밀한 코드 문자열은 읽고 이해하기가 쉽지 않습니다. 비교를 위해 다른 스타일이 있습니다.

#!/bin/sh
#
dt_since=$(date --date='1 week ago' +'%Y-%m-%d')

nr_commits=$(git log --since="$dt_since" | grep '^commit ' | wc -l)
nr_authors=$(git log --since="$dt_since" | grep '^Author:' | sort -u| wc -l)

$nr_commits그런 다음 합계의 결과를 사용하여 몇 가지 수학 연산을 수행할 수 있습니다 $nr_authors. 당신이 무엇을 성취하고 싶은지 잘 모르겠습니다.설명했다as &&는 작성자가 하나 이상의 커밋을 가지고 있는 경우 성공적인(0 값) 종료 상태를 얻고 싶다는 의미입니다.

[ $nr_commits -gt 0 ] && [ $nr_authors -gt 0 ]
exit

( $nr_commits0이 아닌 경우 작성자가 있어야 하므로 $nr_authors체크를 완전히 제거하여 표현식을 최적화할 수 있습니다.)

오류에 관해서는 보여주신 코드에는 아무런 문제가 없으므로 let도움을 드릴 수 없습니다.let

관련 정보