Shell中的數值計算

2022-08-23 02:21:12 字數 4052 閱讀 4206

#!/bin/bash

echo "please input number:"

read n

a=`expr $n / 100`

#a1=`expr $n - $a * 100`

b=`echo "($n-$a*100)/10" | bc`

c=`echo "($n-$a*100-$b*10)" | bc`

d=`echo "$c*100+$b*10+$a" | bc`

echo $d

**1.對某個數加一

$ i=0;

$ ((i++))

$ echo $i

1$ let i++

$ echo $i

2$ expr $i + 1

3$ echo $i

2$ echo $i 1 | awk ''

let i++;

i=$(expr $i + 1)

i=$(echo $i+1|bc)

i=$(echo "$i 1" | awk '')

2.用time統計指令碼執行時間

$ time calc.sh

10000

real    0m1.319s

user    0m1.056s

sys     0m0.036s

$ time calc_let.sh

3.用shell的內建命令檢視各個命令的型別如下:

$ type type

type is a shell builtin

$ type let

let is a shell builtin

$ type expr

expr is hashed (/usr/bin/expr)

$ type bc

bc is hashed (/usr/bin/bc)

$ type awk

awk is /usr/bin/awk

4.let,expr,bc都可以用來求模,運算子都是%,而let和bc可以用來求冪,運算子不一樣,前者是**,後者是^

//求模

$ expr 5 % 2

1$ let i=5%2

$ echo $i

1$ echo 5 % 2 | bc

1$ ((i=5%2))

$ echo $i

1//求冪

$ let i=5**2

$ echo $i

25$ ((i=5**2))

$ echo $i

25$ echo "5^2" | bc

255.浮點預算,let和expr都無法進行浮點運算,但是bc和awk可以。

例一:$ echo "scale=3; 1/13"  | bc

.076

$ echo "1 13" | awk ''

0.077

例二:$ echo 1/13100 | bc -l

.00007633587786259541

例三:假如有這樣一組資料,存放有某個村莊所有家庭的人數和月總收入,要求找 出人均月收入最高的家庭。檔名為innode

1 3 4490

2 5 3896

3 4 3112

4 4 4716

5 4 4578

6 6 5399

7 3 5089

8 6 3029

9 4 6195

10 5 5145

注:通過下面指令碼產生上面三列隨機數:

for i in $(seq 1 10);do echo $i $(($random/8192+3)) $((random/10+3000));done

說明:上面的三列資料分別是家庭編號、家庭人數、家庭月總收入。

分析:為了求出月均收入最高的家庭,我們需要對後面兩列數進行除法運算,即求出每個家庭的月均收入,然後按照月均收入排序,找出收入最高的家庭。

#!/bin/bash

# gettopfamily.sh

[ $# -lt 1 ] && echo "please input the file who store the income data" && exit -1[ ! -f $1 ] && echo "$1 is not a file" && exit -1income=$1awk '' $income | sort -k 2 -n -r

6.產生乙個隨機數

環境變數random產生0到32767的隨機數,而awk的rand函式可以產生0到1之間的隨機數。

例一:$ echo $random

81$ echo "" | awk ''

0.237788

說明:srand在無引數時,採用當前時間作為rand隨機數產生器的乙個seed

cat text | sed -e "s/[^a-za-z]/\n/g" | grep -v ^$ | sort | uniq -c 

8.統計出出現頻率最高的前10個單詞

cat text | sed -e "s/[^a-za-z]/\n/g" | grep -v ^$ | sort | uniq -c | sort -n -k 1 -r | head -10

說明:cat text: 顯示text檔案裡的內容

sed -e "s/[^a-za-z]/\n/g": 把非字母的字元全部替換成空格,這樣整個文字只剩下字母字元

grep -v ^$:去掉空行

sort: 排序

uniq -c:統計相同行的個數,即每個單詞的個數

sort -n -k 1 -r:按照第一列(-k 1)的數字(-n)逆序(-r)排序

head -10:取出前十行

9.統計文章裡含有的指定單詞的數量

**一#!/bin/bash

# statistic_words.sh

if [ $# -lt 1 ]; then        

echo "error: you should input 2 words at least";        

echo "usage: basename $0 file words ...."       

exit -1

fifile=$1

((words_num=$#-1))

for n in $(seq $words_num)

do    

shift    cat $file | sed -e "s/[^a-za-z]/\n/g" | grep -v ^$ | sort | grep ^$1$ | uniq -c

done

**二#!/bin/bash

# statistic_words.sh

if [ $# -lt 1 ]; then        

echo "error: you should input 2 words at least";        

echo "usage: basename $0 file words ...."        

exit -1

fifile=$1

((words_num=$#-1))

for n in $(seq $words_num)

do    

shift    cat $file | sed -e "s/[^a-za-z]/\n/g" | grep -v ^$ | sort | uniq -c | grep " $1$"

done

說明:很明顯,採用第一種辦法效率要高很多,因為第一種辦法提前找出了需要統計的單詞,然後再統計,而後者則不然。實際上,如果使用grep的-e選項, 我們無須引入迴圈,而用一條命令就可以搞定:

$ cat text | sed -e "s/[^a-za-z]/\n/g" | grep -v ^$ | sort | grep -e "^action$|^is$" | uniq

-c或者

$ cat text | sed -e "s/[^a-za-z]/\n/g" | grep -v ^$ | sort | egrep  "^action$|^is$" | uniq

-c補充:

在《高階bash指令碼程式設計指南》一書中還提到jot命令和factor命令

factor產生乙個數的所有素數

Shell 數值計算

一 整數計算 shell中 let expr能進行整數運算。這個方法很方便。很容易使用,推薦使用 的用法 表示式 示例 root localhost shell protest echo 1 2 3 root localhost shell protest echo 1 2 2 root local...

Shell 數值計算

開啟文字編輯器 可以使用 vi vim 命令來建立檔案 新建乙個檔案 test.sh,擴充套件名為 sh sh代表shell 副檔名並不影響指令碼執行,只是起到乙個見名知意的作用。指令碼的第一行一般是 bin bash,告訴系統其後路徑所指定的程式即是解釋此指令碼檔案的 shell 程式。預設用 v...

shell變數的數值計算

root foundation63 a 123 root foundation63 expr a 10 133 root foundation63 expr a 10 113 root foundation63 expr a 10 此命令不能識別,必須加 root foundation63 echo...