標籤:
#!/bin/bashecho "please input number:"read na=`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轉:http://bbs.techrepublic.com.cn/viewthread.php?tid=1404251.對某個數加一$ i=0;$ ((i++))$ echo $i1$ let i++$ echo $i2$ expr $i + 13$ echo $i2$ echo $i 1 | awk ‘{printf $1+$2}‘ let i++;i=$(expr $i + 1)i=$(echo $i+1|bc)i=$(echo "$i 1" | awk ‘{printf $1+$2;}‘) 2.用time統計指令碼已耗用時間$ time calc.sh10000 real 0m1.319suser 0m1.056ssys 0m0.036s$ time calc_let.sh3.用shell的內建命令查看各個命令的類型如下:$ type typetype is a shell builtin$ type letlet is a shell builtin$ type exprexpr is hashed (/usr/bin/expr)$ type bcbc is hashed (/usr/bin/bc)$ type awkawk is /usr/bin/awk4.let,expr,bc都可以用來求模,運算子都是%,而let和bc可以用來求冪,運算子不一樣,前者是**,後者是^//求模$ expr 5 % 21$ let i=5%2$ echo $i1$ echo 5 % 2 | bc1$ ((i=5%2))$ echo $i1//求冪$ let i=5**2$ echo $i25$ ((i=5**2))$ echo $i25$ echo "5^2" | bc25 5.浮點預算,let和expr都無法進行浮點運算,但是bc和awk可以。例一: $ echo "scale=3; 1/13" | bc .076 $ echo "1 13" | awk ‘{printf("%0.3f\n",$1/$2)}‘ 0.077例二:$ echo 1/13100 | bc -l.00007633587786259541 例三:假如有這樣一組資料,存放有某個村莊所有家庭的人數和月總收入,要求找 出人均月收入最高的家庭。檔案名稱為innode1 3 44902 5 38963 4 31124 4 47165 4 45786 6 53997 3 50898 6 30299 4 619510 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 ‘{ printf("%d %0.2f\n", $1, $3/$2);}‘ $income | sort -k 2 -n -r 6.產生一個隨機數環境變數RANDOM產生0到32767的隨機數,而awk的rand函數可以產生0到1之間的隨機數。例一:$ echo $RANDOM81$ echo "" | awk ‘{srand(); printf("%f", rand());}‘0.237788說明:srand在無參數時,採用目前時間作為rand隨機數產生器的一個seed 7.統計某篇文章中單詞出現的個數: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.shif [ $# -lt 1 ]; then echo "ERROR: you should input 2 words at least"; echo "Usage: basename $0 FILE WORDS ...." exit -1fiFILE=$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 -cdone代碼二#!/bin/bash# statistic_words.shif [ $# -lt 1 ]; then echo "ERROR: you should input 2 words at least"; echo "Usage: basename $0 FILE WORDS ...." exit -1fiFILE=$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中的數值計算