作業(練習)內容:
1、描述shell程序的運行原理(可附帶必要的圖形說明);
Shell(外殼):交互式進程。編譯器,解釋器
shell作爲操作系統的外殼,爲用戶提供使用操作系統的接口。它是命令語言、命令解釋程序及程序設計語言的統稱。如果把Linux內核想象成一個球體的中心,shell就是圍繞內核的外層。
2、總結shell編程中所涉及到的所有知識點(如:變量、語法、命令狀態等等等,要帶圖的喲);
面向對象:把整個我們要實現的項目抽象成一個一個的對象並且定義對象之間的動作
面向過程:把編程着源點立足點主要在問題解決過程本身
腳本或程序源文件:文本文件
兩種方式:
編譯執行:預處理-->編譯-->彙編-->鏈接;事先完成,結果:二進制程序文件C, C++
解釋執行:由解釋器全程參與運行過程,每次讀取一行,運行一行;
程序:指令+數據
算法+數據結構
過程式編程:以指令爲中心,設計算法,數據服務於算法;
對象式編程:以數據爲中心,設計數據結構(類),程序服務於數據結構;
bash過程式編程:
順序執行:逐個執行
選擇執行:只執行其中一個分支
循環執行:一段代碼要執行0,1或多遍
編程元素:變量、流程、函數
變量:可變化的量,命名內存空間
bash環境:
本地變量:當前shell進程;
name=value
name: 變量名
=:賦值符號
value:值
變量名:只能包含數字、字母和下劃線;且不能以數字開頭;
引用變量:${name}, $name
弱引用: "", 其內部的變量引用會被替換爲變量值;
強引用:'',其變量的變量引用會保持原有字符;
命令引用:`COMMAND`,$(COMMAND),引用命令的執行結果;
聲明爲整型:
declare -i name[=value]
letname=value
環境變量:當前shell進程及其子進程;
被”導出”的本地變量
exportname[=value]
declare-x name[=value]
查看所有環境變量:env, printenv, export
銷燬:
unsetname
局部變量:某個函數執行過程;
位置參數變量:在腳本中引用傳遞給腳本的參數;在函數中引用傳遞給函數的參數;
特殊變量:$?, $*, $@, $#, $$
變量類型:
數值:整數,浮點數
字符:ASCII
作用:存儲空間,運算,存儲格式
腳本:文本文件
腳本運行,事實上是運行一個bash進程,此進程負責從腳本文件中讀取一個執行邏輯,而後bash解析並運行此邏輯
啓動腳本:
(1)#bash /PATH/TO/SCRIPT_FILE
(2)一個執行權限
#./PATH/TO/SCRIPT_FILE
第一行:頂格給出shebang
註釋行:#
bash的常用選項:
-n:檢查腳本中的語法錯誤;
-x:調試執行腳本;
條件測試:
界定程序執行環境;
(1) 根據運行的命令的狀態結果;
(2) 測試表達式
testEXPRESSION
[EXPRESSION ]
`EXPRESSION `
整數測試:隱含着做數值大小比較,所以不要給變量引用加引用;
$A-gt $B:是否大於;是則爲“真”,否則爲“假”;
$A-ge $B: 是否大於等於;
$A-lt $B:是否小於;
$A-le $B: 是否小於等於;
$A-eq $B: 是否等於;
$A-ne $B:是否不等於;
[root@localhost bin]# A=3 [root@localhost bin]# B=8 [root@localhost bin]# [ $A -gt $B ] [root@localhost bin]# echo $? 1
符串測試:ASCII數值越大,字符比較時其值越大;
"$A"> "$B":是否大於;
"$A"< "$B":是否小於;
"$A"== "$B":是否等於;
"$A"!= "$B":是否不等於;
-z"$A":是否爲空;空則爲“真”,否則爲“假”
-n"$A":是否不空;不空則“真”,空則爲“假”
[root@localhost bin]# A=3 [root@localhost bin]# B=8 [root@localhost bin]# [ "$A" != "$B" ] [root@localhost bin]# echo $? 0 [root@localhost bin]#
注意:應該使用` EXPRESSION `
文件測試:測試文件的存在性以及屬性;
-e$file: 是否存在;存在則爲“真”,否則爲“假”;
-a$file: 同上;
-f$file:文件是否存在且爲普通文件;
-d$file:文件是否存在且爲目錄;
-h$file:是否存在且爲符號鏈接文件;
-L$file: 同上
-b$file:是否存在且爲塊設備文件;
-c$file:是否存在且爲字符設備文件;
-S$file:是否存在且爲套接字文件;
-p$file: 是否存在且爲管道文件;
[root@localhost bin]# [ -e /etc/fstab ] [root@localhost bin]# echo $? 0
-r$file: 當前用戶對文件是否擁有讀權限;
-w$file:當前用戶對文件是否擁有寫權限;
-x$file:當前用戶對文件是否擁有執行權限;
[root@localhost bin]# [ -r /etc/fstab ] [root@localhost bin]# echo $? 0 [root@localhost bin]# [ -w /etc/fstab ] [root@localhost bin]# echo $? 0 [root@localhost bin]# [ -x /etc/fstab ] [root@localhost bin]# echo $? 1
-u $file:文件是否擁有SUID權限;
-g$file:文件是否擁有SGID權限;
-k$file:文件是否擁有sticky權限;
-O$file: 當前用戶是否爲指定文件的屬主;
-G$file: 當前用戶是否爲指定文件的屬組;
雙目操作符:
$file1-nt $file2: file1是否新於file2, file1的最近一次的修改時間戳是否晚於file2的;
$file1-ot $file2: file1是否舊於file2, file1的最近一次的修改時間戳是否早於file2的;
$file1-ef $file2:file1與file2是否指向了同一個inode;測試二者是否爲同一個文件的硬鏈接;
特殊設備:
/dev/null:空,bit buckets,吞下所有數據,並直接丟棄;
/dev/zero:吐出一N多個0;
特殊變量:
$?:命令的狀態結果;
$#:傳遞給腳本或函數的參數的個數;
$*和$@: 引用傳遞給腳本或函數的參數列表;
shift[n]:輪替
bash之條件判斷(選擇執行):
if/then,case
[root@localhost bin]# vi 1.sh #!/bin/bash # username=user1 if ! id $username &> /dev/null; then useradd $username echo $username | passwd--stdin $username &> /dev/null fi
while, until
3、總結課程所講的所有循環語句、條件判斷的使用方法及其相關示例;(if (jpg|png is not exist);echo ”You say a XX“)
循環語句:for, while, until
for 對一段語句重複讀取執行,一般均設置一個退出或進入循環的條件來控制循環的次數
for語法:
for 變量名 in 列表;do
循環類容
done
進入條件:列表非空
退出條件:列表遍歷結束
循環語句:
for, #!/bin/bash for username in$(cut -d: -f1 /etc/passwd); do echo "$username primary group:$(id -n -g $username)." Done Until
until 循環執行一系列命令直至條件爲 true 時停止。until 循環與 while 循環在處理方式上剛好相反。一般while循環優於until循環,但在某些時候,也只是極少數情況下,until 循環更加有用。
until 循環格式爲:
until command
do
Statement(s) to beexecuted until command is true
done
command 一般爲條件表達式,如果返回值爲 false,則繼續執行循環體內的語句,否則跳出循環。
例如,使用 until 命令輸出 0 ~ 9 的數字:
#!/bin/bash a=0 until [ ! $a –lt10 ] do echo $a a=expr$a + 1 done
4、寫一個腳本:如果某路徑不存在,則將其創建爲目錄;否則顯示其存在,並顯示內容類型;(不要懷疑,就是這麼簡單)
#!/bin/bash # filname="/tmp/s/d/testdit" if [ -e $filname ]; then echo"$filname 已經存在" file $filname else mkdir -p $filname echo "&dd$filname 完成" fi
5、寫一個腳本,完成如下功能;判斷給定的兩個數值,孰大孰小;給定數值的方法:腳本參數,命令交互;(使用read,依然如此簡單)
#!/bin/bash read -p "輸入兩個整數整數之間空格隔開:" -t 10 num1num2 if [ -z "$num1" ]; then echo "輸入一個整數。" exit 1 fi if [ -z "$num2" ]; then echo "輸入一個整數。" exit 1 fi if [ $num1 -ge $num2 ]; then echo "大: $num1, 小: $num2." else echo "大: $num2, 小: $num1." fi
6、求100以內所有奇數之和(至少用3種方法。是的這是我們的作業^_^)
#!/bin/bash declare -i sum=0 for i in {1..100}; do if [ $[$i%2] -ne 0]; then sum=$[$sum+$i] fi done echo "$sum"
二
#!/bin/bash declare -i sum=0 for i in {1..100}; do if [ $[$i%2] -ne 0]; then sum=$[$sum+$i] fi done echo "$sum"
7、寫一個腳本實現如下功能:
(1) 傳遞兩個文本文件路徑給腳本;
(2) 顯示兩個文件中空白行數較多的文件及其空白行的個數;
(3) 顯示兩個文件中總行數較多的文件及其總行數;
8、寫一個腳本
(1) 提示用戶輸入一個字符串;
(2) 判斷:
如果輸入的是quit,則退出腳本;
否則,則顯示其輸入的字符串內容;
9、寫一個腳本,打印2^n表;n等於一個用戶輸入的值;(不好意思,我調皮了)
10、寫一個腳本,寫這麼幾個函數:函數1、實現給定的兩個數值的之和;函數2、取給定兩個數值的最大公約數;函數3、取給定兩個數值的最小公約數;關於函數的選定、兩個數值都將通過腳本參數進行輸入。