#!/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...