文章目錄
- 題目一
- 題目描述
- 代碼實現
- 關于$#的有關內容
- 實測
- 本程序的作用
- 題目二
- 題目描述
- 代碼實現
- 注釋
- 關于argc、argv
- 關于read函數
- 關于文件描述符
- 關于write函數
- 本程序的作用
- 題目三
- 題目描述
- 代碼實現
- 實測
- 關于grep命令
- 關于read命令
- 題目四
- 題目描述
- 代碼實現
- 關于test命令
- 實測
題目一
題目描述
請給下面的shell程序加注釋,并說明程序的運行結果。
代碼實現
#!/bin/bash
#bash script programming
if test $# == 0 # 參數個數為0(沒有給出參數)
thenls -l|grep '^d' # 尋找并顯示當前目錄中以d開頭的字符串,即目錄文件
else # 參數個數不為0(給出了參數)for idols -l $i|grep '^d' # 尋找并顯示給出的目錄中以d開頭的字符串,即目錄文件done
fi
關于$#的有關內容
$# 表示命令行上參數的個數,但不包括shell腳本名本身
詳情請參考:shell預先定義的特殊變量
實測
當給出參數 / 時
當給出參數 home 時
當給出參數 . 時(. 即為當前目錄)
當不給出參數時
本程序的作用
我們會發現不給參數時執行結果與給出參數 . 時執行結果一致,也就是說本程序的作用是:
沒有給出參數時,尋找并顯示當前目錄中以d開頭的字符串,即目錄文件
給出參數時,尋找并顯示給出的目錄中以d開頭的字符串,即目錄文件
題目二
題目描述
分析程序的功能以及運行結果,在代碼后添加注釋。
代碼實現
注釋
參數小于2輸出“you forgot the enter a filename”
退出并報錯
以只讀方式打開參數1,其權限為0644,并將返回值賦值給fd1
創建一個文件在參數2,其權限為0644,并將返回值賦值給fd2
從fd1中讀取字節數為512的內容到buf緩沖區,并將返回值賦值給n
將buf中字節數為n的內容寫到fd2中,直到n不大于0
關閉fd1,fd2
關于argc、argv
argc表示參數數量,argv則是保存參數的數組,argv[0] 指向程序運行的全路徑名,argv[1]是第一個參數,argv[2]是第二個參數,以此類推……
關于read函數
關于文件描述符
很多函數都會用到這個東西,這個東西其實就跟我們的學號一樣,是為了方便引用某文件而存在的,其類型一般為int,比如一個文件叫test,碰巧還有一個文件叫test,于是我們在引用他們時如果“叫”他們的名字往往容易兩個一起“回應”你,所以我們將他們分別描述為01、02,那么在需要引用他們的時候就方便多了。
關于write函數
本程序的作用
將fd1中的內容全部復制到fd2中
題目三
題目描述
編寫一個shell腳本,檢查給定的用戶是否登陸系統。
代碼實現
read -p "請輸入用戶名:" user
if who|grep -qw $user
thenecho $user login
elseecho $user not login
fi
實測
關于grep命令
本題中用到了grep命令的參數:-q,-w
grep -w :只匹配整個單詞,而不是包含一部分單詞的字符串
(如grep -w cmy 目標文件 ,只會匹配‘cmy’,而不匹配‘cmypangle’這種包含cmy的字符串)
grep -q : Quiet; do not write anything to standard output. Exit immediately with zero status if any match is found, even if an error was detected.
中文意思為,安靜模式,不打印任何標準輸出。如果有匹配的內容則立即返回狀態值0。
不帶-q是這樣的:
不帶-w是這樣的
關于read命令
本題中用到了read命令的參數: -p
read -p :用于給出提示符,p是prompt的縮寫,即由這個開關項給出提示信息。
例如,本題中,回車后屏幕會顯示:
請輸入用戶名:
該語句之后輸入的內容就會被保存到use變量中了
題目四
題目描述
編寫一個shell腳本,判斷文件是不是字符設備文件,如果是,將其拷貝到 /dev 目錄下。
代碼實現
if [[ -c $1 ]]
thencp $1 /dev
elseecho "This file is not a character device file!"
fi
關于test命令
為了方便就直接用老師的PPT截圖了
至于cp命令……emm就是很常規的用法,這里就不說了~
實測
字符設備咱也不知道咋搞,就不搞復制的情況了~