我希望能够在命令行中的数据和 bss 部分下添加文件大小信息中的数字
./script.sh [file name]
到目前为止,我将 Shell 脚本编写为:
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
是我认为 shell 如何从“data”和“bss”列读取的变量
输出size test
:
text data bss dec hexfile name
2231 600 8 2839 b17 test
运行我的脚本后的预期输出:
608
我怎样才能在 Shell 脚本中实现这一点?我做错了什么?
答案1
恐怕你的剧本完全错误。请花时间阅读一些有关 shell 脚本编写的基本教程,以便您了解需要做什么。请注意,您实际上需要读文件,而不仅仅是将其放入变量中。
处理此类事情最常用的工具是awk
.和awk
你一起可以做:
$ awk 'NR>1{print $2+$3}' file
608
NR
是当前行号,$N
是当前行的第N个字段。因此该命令告诉awk
我们跳过第一行 ( NR>1
),然后打印第二个和第三个字段的总和。
贝壳是一个可怕的工具用于解析文件,但如果您绝对必须在 shell 中执行此操作,您可以尝试:
#/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