存在するTLDPスクリプトのWebページ分析、分析のために次のコードを提供します。
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を使用しなくなった人も見ました。