由於助教工作的需要,需要把先前收到的學生的作業重新組織下。考慮到學生作業多,若要純手工操作,會是件相當麻煩的事情,於是決定寫個shell指令碼來解決這個問題。此前基本沒用shell寫過程式,所以,折騰下來也差不多用了一天多的時間。雖然如此,覺得還是蠻有成就感,畢竟印象中這還是第一次自己寫程式解決自己遇到的問題。
需求描述
有一百個學生,每個學生交了三次作業。第n次作業存放在命名為第n次作業的資料夾中,共有三個資料夾,分別是第一次作業,第二次作業,第三次作業。學生的作業以學號_姓名_第n次作業命名。現在要把學生的三次作業均存在以其學號命名的資料夾裡。假設學生的學號為2011001,那麼就需要建立乙個以2011001命名的資料夾,然後把這個學生的三次作業全部轉存到這個資料夾裡。其他學生,以此類推。
需求解決方法
1、用shell指令碼建立以學號命名的資料夾。
#!/bin/sh
cat 學生名單.txt | while read line
do echo $line
num=`echo $line | awk ''` # 學生名單檔案中每行的第乙個欄位是學號
mkdir "../新的作業目錄/$num"
done
2、用shell指令碼轉移學生的作業(作業檔案或作業目錄)。
#!/bin/bash
cat 學生名單.txt | while read line
do num=`echo $line | awk ''`
echo $num
# read num
find ./ -maxdepth 2 -name "*$*" -print -exec mv {} ../新的作業目錄/$ /;
done
3、統計沒有提交作業的學生名單
#!/bin/bash
cat 學號.txt | while read line
do num=`echo $line | awk ''`
name=`echo $line | awk ''`
count=`find ./第四次作業 -maxdepth 1 -name "*$*" -print | wc -l`
echo $count
if [ $count -eq 2 ]; then
echo "$num $name" >> statistic.txt
fi done
遇到的問題
1、shell指令碼中變數賦值的問題。「=」兩邊注意不能有空格。
2、在「學生名單.txt」檔案中,只有學號字段情況下,num變數無法取到值。這個問題還不知道原因。
3、find 搜尋的深度通過設定-maxdepth 2 可以進行控制。
其實,在寫shell指令碼時遇到好多問題,主要是對awk,find等命令不熟悉所致。
參考資料
1、linux grep命令使用的詳細介紹
2、shell 之find
3、bash 中的字串處理
4、if條件判斷,判斷條件
shell小技巧,自己用
1.逗號分割字串為陣列 host 10.0.0.1,10.0.0.2,10.0.0.3 host 3 10.0.0.1 10.0.0.2 10.0.0.3 2.檢視資料夾或檔案是否存在 if d pwd report then echo 建立資料夾 pwd report mkdir pwd repo...
程式自己更新自己的解決方案
這幾天一直在研究自動更新,因為是單exe檔案,dll沒有更新需求。感覺另外做乙個exe來輔助更新有點不爽,所以研究了一下程式如何自己更新自己。有點心得,記載下來!自動更新部分省去,只寫思路 1 程式內定義乙個版本常量,和服務端配置檔案對比,如果版本號不一樣就公升級 伺服器應該不會放低版本的版本號吧,...
程式自己更新自己的解決方案
這幾天一直在研究自動更新,因為是單exe檔案,dll沒有更新需求。感覺另外做乙個exe來輔助更新有點不爽,所以研究了一下程式如何自己更新自己。有點心得,記載下來!自動更新部分省去,只寫思路 1 程式內定義乙個版本常量,和服務端配置檔案對比,如果版本號不一樣就公升級 伺服器應該不會放低版本的版本號吧,...