lab0
Lab 0 主要就是一個 Makefile 和 Linux shell 的練習。你可以從這裡獲取今年實驗的公開指導書(截至發稿時的版本,存於網際網路檔案館)。
練習題
Exercise 0.1
好久沒寫 C。雖然連 palindrome 都不會寫了,但是好像懂得比以前多了很多)
剩下 3 問沒什麼難度。唯須注意的是:
[Makefile 中] 有一點尤為需要注意,每一個命令 (command) 之前必須用一個製表符(Tab)縮排。這裡必須使用製表符而不能是空格,否則 make 會報錯。
考試的時候被坑了。
Exercise 0.2
Shell 的條件和迴圈。
a=1
while [ $a -le 100 ]
do
if [ $a -gt 70 ]
then
rm -r "file$a"
elif [ $a -gt 40 ]
then
mv "file$a" "newfile$a"
fi
# ((a++))
a=$((a+1))
# don't forget change the loop variable
doneExercise 0.3
# First you can use grep (-n) to find the number of lines of string.
# Then you can use awk to separate the answer.
grep -n "$2" "$1" | cut -d: -f1 > "$3"cut -d 後面是分隔符,-f1 是第一個欄位,即行號。
Exercise 0.4
sed -i "s|$2|$3|g" "$1"需要 include 標頭檔案。
all:
bash modify.sh fibo.c char int
gcc -c fibo.c main.c -I../includelab0-exam
GCC & Makefile Quiz
完成初始化後,倉庫根目錄下已經生成了 Makefile、check.c、src 資料夾和 out 資料夾。
在倉庫根目錄(如 ~/23xxxxx )下編寫 Makefile。要求實現的功能如下:
| 執行命令 | 實現功能 |
|---|---|
make check | 利用 gcc 將同目錄下的 check.c 編譯成名為 check.o 的未連結的目標檔案,並放在同目錄下。 |
make | 完成 make check 要求的功能。然後利用 gcc 將 src 下的 main.c、output.c 編譯成名為 main 的可執行檔案,並放在 out 目錄下。 |
make run | 直接執行可執行檔案 out/main。 |
make clean | 刪除目標檔案 check.o、可執行檔案 out/main。 |
GCC & Bash Quiz
完成初始化後,倉庫根目錄下已經生成了 exam_1.sh 至 exam_9.sh(從1開始的連續整命令名的.sh檔案,共9個)、run_exam.sh、stderr.txt 和 origin 資料夾。
在倉庫根目錄(如 ~/23xxxxx )下編寫 exam_1.sh 至 exam_9.sh。要求實現且僅實現以下第x點功能。
這些指令碼將被 run_exam.sh 呼叫執行。使用
run_exam.sh的命令格式為bash run_exam.sh [n] [s] [t],其中 n 為小於等於9 的整數,表示將按順序執行exam_1.sh至exam_n.sh。若 n 未給出,將預設是 9。可選的 s 和 t 用於傳遞給exam_9.sh,具體要求見第 9 點功能。(注意:根據命令格式,若要指定 s 和 t,必須先指定 n)
這個部分討厭的是評測點是累進的,由於後面的操作依賴於前面的操作,所以如果前面的操作沒有正確實現,寫完提交一看才十幾分比較虛。不過檔案操作的話,後面的操作可以作為前面的提示。
-
建立一個新的目錄,名為 result。再在 result 目錄下建立兩個新的目錄,名為 code 和 backup。
exam_1.sh mkdir result mkdir result/code mkdir result/backup -
將 origin 目錄下的 basic.c 的檔案中包含 hello(區分大小寫)的行輸出。
exam_2.sh grep "hello" origin/basic.c -
將 origin 目錄下的 basic.c 檔案移動到 result 目錄下。
exam_3.sh mv origin/basic.c result/basic.c -
將 origin 目錄下的 code 目錄及其內容複製到 result/backup 目錄下。
exam_4.sh cp -r origin/code result/backup/code cp origin/code/* result/backup/不知道具體要求的是哪一種,似乎第一次嘗試時沒過評測。
-
將 origin/code 目錄下的 0.c 1.c 2.c …… 20.c(從0開始的連續整數命名的 .c 檔案,共21個)檔案中的所有
REPLACE(區分大小寫)替換為檔名(不含副檔名),替換的結果儲存到 result/code 目錄下的同名檔案中。如對於這樣的 origin/code/1.c:
int main() { return REPLACE; }替換的結果如下,並且這個結果儲存在 result/code/1.c 中:
int main() { return 1; }這裡麻煩的是如何從路徑提取不含字尾的檔名。之前打 Hackgergame 的時候研究過一番 shell 字串處理(欠了兩年題解沒寫:),但是都忘了。是次考前從圖書館借了兩本 Linux Shell 程式設計的書,從例子部分偷到了用法。
Linux Shell命令列及指令碼程式設計例項詳解(第2版) book
2024 ISBN 9787302660194by 劉豔濤、出版社:清華大學出版社第 104 頁《Linux Shell命令列及指令碼程式設計例項詳解(第2版)》是獲得大量讀者好評的“Linux典藏大系”中的經典暢銷書《Linux Shell命令列及指令碼程式設計例項詳解》的第2版。本書第1版累計13次印刷,銷量超過2萬冊,被ChinaUnix技術社羣大力推薦。本書理論結合實踐,全面、系統地介紹Linux Shell(Bash)指令碼程式設計的語法、命令和技巧等內容。本書偏重於實踐,在講解理論知識時結合大量典型例項讓讀者瞭解理論知識在實際環境中的應用,並對易混淆和較難理解的知識點做了重點分析,以加深讀者對知識的理解。本書提供教學影片、例項源程式、思維導圖、教學PPT和習題參考答案等超值配套資源,以幫助讀者高效、直觀地學習。 《Linux Shell命令列及指令碼程式設計例項詳解(第2版)》共15章,分為2篇。第1篇“Linux Shell基礎知識與命令”,主要內容包括Linux和Linux Shell簡介、初識Linux Shell、常用的Shell(Bash)命令、Shell命令進階;第2篇“Shell指令碼程式設計”,主要內容包括Shell程式設計基礎、Shell的條件執行、Bash迴圈、Shell函式、正規表示式、指令碼輸入處理、Shell重定向、管道和過濾器、捕獲、sed和awk、其他Linux Shell概述。 《Linux Shell命令列及指令碼程式設計例項詳解(第2版)》非常適合初次接觸Linux Shell命令列和指令碼程式設計的入門讀者閱讀,也適合有一定基礎而想進一步提升的進階讀者閱讀,還適合作為高等院校和Linux培訓機構的教材。對於基於Linux平臺的開發人員而言,本書還是一本不可多得的案頭查詢手冊。 劉豔濤,就職於一家全球500強通訊公司,從事公司無線產品研發中心的Linux/Unix作業系統的管理和技術支援。有超過15年的Linux系統管理與運維經驗,擅長用Shell等指令碼語言實現自動化運維管理,以及配置Nagios與Ganglia整合的自動化監控和故障報警平臺,對Linux系統效能最佳化有深入的研究。
exam_5.sh for file in `ls origin/code/*.c` do filename=${file##*/} # echo $filename # echo ${filename%.*} sed "s/REPLACE/${filename%.*}/g" $file > "result/code/${filename}" # sed 's/REPLACE//g' $file > done- 從開頭刪除最短匹配的模式:
var# - 從開頭刪除最長匹配的模式:
var## - 從結尾刪除最短匹配的模式:
var% - 從結尾刪除最長匹配的模式:
var%%
用 basename 的話,
$(basename "$file" .${file##*.})。 - 從開頭刪除最短匹配的模式:
-
將 result/code 目錄下的全部 .c 檔案一起編譯為可執行檔案 result/verify。
exam_6.sh gcc result/code/*.c -o result/verify -
執行可執行檔案 result/verify,將其標準錯誤輸出的內容追加到倉庫根目錄下的 stderr.txt 檔案。
exam_7.sh ./result/verify 2>>stderr.txt -
將 stderr.txt 檔案的許可權修改為 r--r-----。
exam_8.sh chmod 440 stderr.txt -
run_exam.sh 以 bash `exam_9.sh [s] [t]` 的格式向 exam_9.sh 傳入兩個引數 s, t(整數且 s < t)。
- 兩個引數預設時,輸出 stderr.txt 的所有內容。
- 僅預設 t 時,輸出 stderr.txt 自行開始(行號從 1 開始編譯,輸出自第 s 行)至結尾的內容。
- 兩個引數指定時,輸出 stderr.txt 自第 s 行至第 t 行的內容(輸出包含第 s 行,不含第 t 行)。
exam_9.sh if [ -n "$1" ]; then if [ -n "$2" ]; then # echo "a" # echo "$(($2 - 1))" sed -n "$1,$(($2 - 1))p" stderr.txt else # echo "b" sed -n "$1,\$p" stderr.txt fi else cat stderr.txt fi這塊需要需要注意的是,
sed的p命令列印的行數從 1 開始,且包含結束行。head和tail組合也可以,但是仍然需要 。
提示
- 下發檔案中包含一個初始化指令碼
init.sh,如果你想將你的工作目錄下除了 Makefile 和 exam_1.sh 至 exam_9.sh 之外的所有檔案恢復到題目下發時的狀態,可以使用命令bash init.sh執行該指令碼。- 將多個檔案一起編譯,可以藉助萬用字元
*。如強制刪除當前目錄下的所有副檔名為.txt的檔案可以使用rm -f *.txt。參考輸出
使用下發的
init.sh初始化後,執行make後再執行make run的參考結果為:

評論