看了《linux程序設計(第4版)》(作者:Neil Matthew ,Richard Stones ,陳建 ,宋健建譯)。做個筆記,以備后面查看。
首先,清楚幾個概念。
shell編程屬於腳本編程,腳本文件就是指令的集合,GCC是GNU編譯系統驅動程序。
Linux中的庫分兩種:靜態庫和共享庫。靜態庫以.a結尾,也叫歸檔文件(archive),類似於windows中的.lib文件,他的缺點是同時運行的多個程序使用同個函數庫函數時,內存中會有多個該函數及該程序文件的副本,浪費了內存。共享庫以.so結尾,類似於windows中的.Dll文件。
shell是對linux內核的一種封裝,提供了一些函數的接口,shell程序設計就是利用這些函數接口進行編程。
一般linux系統的shell裝的是bash(Bourne Angain Shell),安裝為/bin/sh,可以用$/bin/bash --version命令查看bash版本號:

重定向
重定向有重定向輸入和重定向輸出,似乎重定向輸出用的比較多,可以將默認輸出到屏幕上的內容重定向輸出到一個文檔中,eg:

也可以用>>將內容追加的重定向到已有的文件中,eg:

重定向輸入使用<符號
管道
管道的作用是可以讓進程進行通信,這樣一個進程的結果就可以作為另一個進程的操作對象,比如說想對ps列出的進程列表進行sort排序,然后分屏輸出,就可以使用命令:ps | sort more

通配符
通配符可以匹配字符串、單個字符等
*:表示任意字符串
?:表示任意單個字符
[]:[]中可以添加任意的字符
[^ ]:表示不匹配[]里面的字符
{}:中添加的是字符串
創建腳本
可以使用vim編輯腳本文件,使用bash的話腳本文件的首行是:#!/bin/sh 聲明語句。
linux中的變量不用聲明類型,系統默認是字符串型,當時數值時,系統會自動轉變類型,使用“$”+變量名,可以訪問變量內容。要想輸出空格,要用“”括起來,否則空格會被會略。
可以使用read操作將命令行下用戶輸入的內容賦值給指定的變量。
“” ‘’ \ 對變量操作的區別:
“$變量名”輸出的是變量的內容,
‘$變量名’ \$變量名輸出的是變量名本身,也就是說他們兩個去掉了$的作用。

注意創建完腳本文件后需要把該文件的執行權限加上,命令為:chmod +x 文件名
在環境變量中,IFS表示輸入域分隔符,用戶可以將空格、制表符、換行符賦值給他,然后當shell讀取輸入時就可以安裝IFS的值分隔單詞,eg:

可以看出“$@”是不受IFS影響的,"$*"則受IFS影響。
布爾命令:test或者[]
條件語句后面跟的條件可以放在test或者[]中
模板為:if test 條件 if [ 條件 ] 要注意[]和條件語句之間要有空格隔開,並且等號左右都要有空格
then then
執行語句 執行語句
fi fi
比較的條件可以有字符串、算術、文件相關測試,一下三個表都來自於《linux程序設計(第4版)》



if語句
每組if語句都要使用fi做結束標志,eg:
if 條件 if 條件1
then then
語句1 語句1
else elif 條件2
語句2 then
語句2
fi else
語句3
fi

for語句
for語句一般針對於字符串
模板: for 變量名 in 值的范圍(一般為字符串)
do
語句
done

while語句和until語句
while和until語句的區別是:
while語句至少執行一次,而until語句則不一定;while是條件為真時執行循環體,until是當條件不成立時執行循環體(如果判斷某個用戶登錄的話用until語句比較合理)
模板:while(until)條件
do
語句
done

case語句
case語句的每個條件成立后執行語句體結束時一定要記得用兩個;;表示結束,用esac表示case語句的結束
模板:case 變量名 in
值1) 語句體1
語句體2;;
值2) 語句體3;;
······
esac
exit 0

判斷條件的連接可以用AND:&&或者是OR:||,用法和c語言是一樣的。
函數:
函數不用聲明返回值類型,直接可以用:
函數名(){
}
來定義函數體。
如果函數需要操作從命令行輸入的變量時,在函數體中可以用“$*”來指代該參數。

其中調用函數時Child 后的$1表示腳本程序的參數,判斷的是該函數的返回值
冒號:表示的是空命令,while true就等價於while :
