데이터 및 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
)을 건너뛰고 두 번째와 세 번째 필드의 합계를 인쇄하도록 지시합니다.
껍데기끔찍한 도구다파일을 구문 분석하기 위해 셸에서 반드시 수행해야 하는 경우 다음을 시도해 볼 수 있습니다.
#/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