用shell程式解決自己的需求

2021-05-26 03:29:49 字數 1564 閱讀 5859

由於助教工作的需要,需要把先前收到的學生的作業重新組織下。考慮到學生作業多,若要純手工操作,會是件相當麻煩的事情,於是決定寫個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 程式內定義乙個版本常量,和服務端配置檔案對比,如果版本號不一樣就公升級 伺服器應該不會放低版本的版本號吧,...