shell編程實戰14

1. 備份etc目錄bash

 

2. 給文件增長插入內容函數

 

3. 人員隨機分組blog

#!/bin/bash字符串

f=member.txt ##人員列表,一行一我的員
member_n=`wc -l $f|awk '{print $1}'`
group_n=7 ##7**2,人員數開平方get

## 根據人員姓名計算該成員所在小組的ID,即小組號
get_n()
{
## 根據人員姓名計算cksum值,即根據字符串計算隨機數字,非隨機字符串
l=`echo $1|cksum|awk '{print $1}'`
## 獲取一個隨機數
n1=$RANDOM
## cksum值和隨機數相加,使隨機數更加隨機;而後除以小組數取餘;這樣每次得到的餘數都會不同(即人員分的組不同)
n2=$[$l+$n1]
g_id=$[$n2%$group_n]
## 假如小組數爲7,則餘數的範圍則是0-6,餘數爲0則小組id爲7

if [ $g_id -eq 0 ]
then
g_id=$group_n
fi
echo $g_id ## 函數返回值
}it

## 檢測n_$i.txt組臨時文件,用來記錄對應的每一個小組內的成員,n_3.txt用來記錄第3小組內的成員
for i in `seq 1 group_n`
do
## 若是腳本執行過則該文件會存在,本次執行腳本前應該刪除該臨時文件,每次分組內的成員都不同
[ -f n_$i.txt ] && rm -f n_$i.txt
donetable

shuf $f|while read name
do
## 計算人員所在組的ID,調用前面的函數
g=`get_n $name`
## 將人員寫入其對應的組臨時文件n_$i.txt中
echo "$name" >> n_$g.txt
doneawk

定義計算組臨時文件n_$i.txt行數的函數
nu()
{
wc -l $1|awk '{print $1}'
}變量

## 定義函數:獲取小組人員數量的最大值
max()
{
ma=0 ## 小組內人員數量的最大值,最小是0
for i in `seq 1 $group_n|shuf`
do
n=`nu n_$i.txt`
if [ $n -gt $ma ]
then
ma=$n
fi
done
echo $ma
}
## 定義函數:獲取小組人員數量的最小值
min()
{
mi=$member_n ## 小組內人員數量的最小值,最大是member_n,全部人員的總數量
for i in `seq 1 $group_n|shuf`
do
n=`nu n_$i.txt`
if [ $n -lt $mi ]
then
mi=$n
fi
done
echo $mi
}隨機數

## 定義四捨五入函數
div()
{
n=`echo "scale=1;$1/$2"|bc` ## 兩個數相除
n1=`echo "scale=1;$n+0.5"|bc` 
echo $n1|cut -d. -f1 
}

## 小組組員數量的平均值(非四捨五入)
ava_n=$[$member_n/$group_n]
## 小組組員數量的平均值(四捨五入)
ava_n1=`div $member_n $group_n`

if [ $ava_n -eq $ava_n1 ]
then
## 定義初始最小值
ini_min=1
## while循環:把人數多的組裏面的人員 轉移到 人數少的組裏去
## 人數少的組的定義是:其組成員的數量 小於 小組組員數量的平均值
while [ $ini_min -lt $ava_n1 ]
do

m1=`max` ## 小組組員數量的最大值
m2=`min`
for i in `seq 1 $group_n|shuf`
do
n=`nu n_$i.txt`
## 找出人數最多的組對應的組人員文件f1,可能有多個,這裏取出現的第一個便可
if [ $n -eq $m1 ]
then
f1=n_$i.txt
## 找出人數最多少的組對應的組人員文件f2,可能有多個,這裏取出現的第一個便可
else if [ $n -eq $m2 ]
then
f2=n_$i.txt
fi
done

name=`tail -n1 $f1` ## 取人數最多的組人員文件f1的最後一我的名
echo "$name" >> $f2
sed -i "/$name/d" $1 ## 在組人員文件f1中刪除剛剛取走的人名

## 把此時(轉移人員後)組員數量的最小值賦值給變量ini_min
ini_min=`min` ## 調用min函數;循環後變量ini_min的值最接近變量ava_n1的值
done
else
## 定義初始最大值
ini_max=$member_n
## while循環:把人數多的組裏面的人員 轉移到 人數少的組裏去
## 人數多的組的定義是:其組成員的數量 大於 小組組員數量的平均值
while [ $ini_max -gt $ava_n1 ]
do

m1=`max` ## 小組組員數量的最大值
m2=`min`
for i in `seq 1 $group_n|shuf`
do
n=`nu n_$i.txt`
## 找出人數最多的組對應的組人員文件f1,可能有多個,這裏取出現的第一個便可
if [ $n -eq $m1 ]
then
f1=n_$i.txt
## 找出人數最多少的組對應的組人員文件f2,可能有多個,這裏取出現的第一個便可
else if [ $n -eq $m2 ]
then
f2=n_$i.txt
fi
done

name=`tail -n1 $f1` ## 取人數最多的組人員文件f1的最後一我的名
echo "$name" >> $f2
sed -i "/$name/d" $1 ## 在組人員文件f1中刪除剛剛取走的人名

## 把此時(轉移人員後)組員數量的最小值賦值給變量ini_min
ini_max=`max` ## 調用max函數;循環後變量ini_max的值最接近變量ava_n1的值
fi

for i in `seq 1 $group_n`
do
echo -e "\033[34m$i 組成員有:\033[0m" ## 帶顏色輸出組成員
cat n_$i.txt
## 刪除組臨時文件
rm -f n_$i.txt
echo
done

 

 

4. 統計重複的單詞

 

5. 比較兩個數的大小(支持浮點數)

#!/bin/bash

if [ $# -ne 2 ]
then
echo "提供的腳本參數必須爲2個"
exit
fi

if_num()
{
#if grep -q '^-' $1 &>/dev/null ## 負數的狀況
if echo $1|grep -q '^-' >/dev/null 2>/dev/null
then
nu=`echo $1|sed 's/^-//g'` ## 刪除開頭的-號
else
nu=$1
fi

n=`echo $nu|sed 's/[0-9.]//g'` ## 刪除數字和符號.
if [ -n "$n" ]
then
echo "$1不是一個純數字"
exit
fi
#if grep -q "^\." $1 ## 判斷是否是以.開頭的數字
if echo $1|grep -q "^\."
then
echo "$1不是一個合法的數字"
exit
fi
}

if_num $1
if_num $2

n1=`echo "$1>$2"|bc`if [ $n1 -eq 1 ]then echo "$1大於$2"else ## $1<=$2的狀況 n2=`echo "$1==$2"|bc` #n2=`echo "$1-$2"|bc` #if [ $n2 -eq 0 ] ## 不能用於浮點數的比較 if [ $n2 == "1" ] then echo "$1等於$2" else echo "$1小於$2" fifi

相關文章
相關標籤/搜索