
データセクションとbssセクションの下のコマンドラインのファイルサイズ情報に数字を追加できるようにしたいです。
./script.sh [file name]
これまで、シェルスクリプトを次のように書いています。
ExcPath=$1 #read file name from command line
Numberone= size $1 | $data #put data column into Numberone
Numbertwo= size $1 | $bss #put bss column into Numbertwo
sum=$(( $Numberone + $Numbertwo )) # calculate the sum of DATA and BSS
echo $sum
$data
そして、$bss
シェルが「data」列と「bss」列から読み取ると思われる変数は何ですか?
出力size test
:
text data bss dec hexfile name
2231 600 8 2839 b17 test
私のスクリプトを実行した後に予想される出力は次のとおりです。
608
シェルスクリプトでこれをどのように達成できますか?私は何が間違っていましたか?
答え1
あなたのスクリプトが完全に間違っているようです。時間をかけて、シェルスクリプトに関するいくつかの基本的なチュートリアルを読んで、何をすべきかを理解してください。実際に必要であることに注意してください。読むファイルを変数に入れる代わりに。
この種の作業を処理する最も一般的なツールは次のとおりですawk
。awk
$ awk 'NR>1{print $2+$3}' file
608
NR
は現在の行番号で、$N
現在の行のN番目のフィールドです。したがって、コマンドはawk
最初の行(NR>1
)をスキップし、2番目と3番目のフィールドの合計を印刷するように指示します。
シェルひどい道具だファイルを解析するためにシェルで実行する必要がある場合は、次のことを試すことができます。
#/bin/bash
ExcPath=$1
## Now, skip the first line and read the rest
tail -n+2 "$ExcPath" |
## split on whitespace and save in the variables
while read text data bss dec hexfile name; do
echo $(( $data + $bss))
done
別の名前で保存しscript.sh
て、./script.sh filename
次のように実行してください。
$ ./script.sh file
608
答え2
注文する
z=0;for l in `awk '{for(i=1;i<=NF;i++){if($i ~ /data|bss/){print i}}}' filename`; do m=`awk -v l="$l" 'BEGIN{sum=0}{sum=sum+$l}END{print sum}' p`;z=$(($z+$m)); done;echo $z
出力
608