존재하다TLDP 스크립트 웹 페이지 분석, 분석을 위해 다음 코드를 제공합니다.
export SUM=0
for f in $(find src -name "*.java"); do
export SUM=$(($SUM + $(wc -l $f | awk '{ print $1 }')))
done
echo $SUM
내가 이해한 바로는 디렉토리에 있는 모든 *.java 파일의 줄 수 합계를 계산합니다 src
. 내가 이해하지 못하는 것은 키워드를 사용하는 이유입니다 export
.그렇게 설명했다:
내보내기 명령은 실행 중인 스크립트 또는 셸의 모든 하위 프로세스에서 변수를 사용할 수 있도록 합니다.
자식 프로세스는 절대 접근하지 않을 것이기 때문에 SUM
내보내는 이유는 무엇입니까?
답변1
내가 이해한 바에 따르면 src 디렉토리에 있는 모든 *.java 파일의 행 합계를 계산합니다.
이것은 반드시 전적으로 사실은 아닙니다. *.java
디렉토리 트리에 루트가 있는 모든 파일 src
(즉 , 모든 하위 디렉토리) src
의 줄 수 합계를 계산합니다 . 그러나 공백을 포함하고 .java
.
SUM은 하위 프로세스에서 액세스할 수 없으므로 내보낼 이유가 있습니까?
아니요.
이 프로세스 중에 파일 이름을 안전하게 만들기 위해 다음과 같은 코드 조각을 작성할 수 있습니다.
find src -type f -name '*.java' -exec wc -l {} \; | awk '{ s += $1 } END { print s }'
더 나은 해결책은 다음과 같습니다.
find src -type f -name '*.java' -exec cat {} + | wc -l
답변2
맞습니다. 여기서는 사용할 필요가 없습니다 export
. 하지만 이 코드에는 더 많은 문제가 있습니다.
$ ~/.cabal/bin/shellcheck e.sh
In e.sh line 4:
for f in $(find src -name "*.java"); do
^------------------------^ SC2044: For loops over find output are fragile. Use find -exec or a while read loop.
In e.sh line 5:
export SUM=$(($SUM + $(wc -l $f | awk '{ print $1 }')))
^--^ SC2004: $/${} is unnecessary on arithmetic variables.
^-- SC2086: Double quote to prevent globbing and word splitting.
Did you mean:
export SUM=$(($SUM + $(wc -l "$f" | awk '{ print $1 }')))
For more information:
https://www.shellcheck.net/wiki/SC2044 -- For loops over find output are fr...
https://www.shellcheck.net/wiki/SC2086 -- Double quote to prevent globbing ...
https://www.shellcheck.net/wiki/SC2004 -- $/${} is unnecessary on arithmeti...
스크립트에서는 소문자 변수 이름을 사용하는 것이 좋습니다. 이것 설명을 위해.
일반적으로 tldp.org는 권장되지 않습니다. 이것또는 이것. 나는 또한 StackExchange에서 tldp.org를 더 이상 사용하지 않는 사람들을 보았습니다.