1

コマンドラインから複数のファイルの行数の合計を保持する、書き込もうとしているUNIXシェルスクリプトにいくつかの問題があります。行を個別にカウントし、ループを実行するたびに表示できますが、行変数は常に最後に 0 を読み取ります。

#! /bin/sh
lines=0

line_count(){
    #count the lines
    l= blablabla.....
    lines=`lines + l`
}

for f in "$@"
do
echo "total lines:"
( line_count "$f" )
done
4

1 に答える 1

3

サブシェルで何かを実行する場合、変数の変更 (例: 増加$lines) はそのサブシェル内でのみ有効であり、サブシェルが終了すると失われます。ただし、関数を使用しているため、サブシェルはまったく必要ありません。関数を呼び出すだけです。

また、引数およびを指定lines=`lines + l`してコマンドを実行しようとしますが、これは意図したものではないと思います。式の結果を評価するには、構文を使用し、変数の前に追加して値を操作します。lines+l$(( ... ))$

最後に、 の値を使用することはありませ$linesん。関数を呼び出した後で、値を出力したい場合があります。

#! /bin/sh
lines=0

line_count(){
    #count the lines
    l= blablabla.....
    lines=$(( $lines + $l ))
}

for f in "$@"
do
    line_count "$f"
    echo "total lines: $lines"
done
于 2012-11-30T13:39:24.023 に答える