Linux命令列和shell指令碼編程寶典
這次閱讀《Linux命令列和shell指令碼編程寶典》這本書是第3次閱讀。 總的來說,這本書還是挺不錯的。很適合入門。我也是從這本書開始瞭解shell編程的。
不過,因為現在對Linux 環境也比較熟悉了,並且也會一些shell編程了,所以,這次看的時候會比較快,有些已經會的東西就沒有寫。只是記錄下那些之前沒有注意到的東西。
第1章 Linux shell入門
Linux 核心
GNU軟體:
Gnome shell
Gnome軟體
Linux發行版
(1)核心發行版
(2)特定發行版
第2章 瞭解shell
Linux下的虛擬控制台:ctrl+Alt+F1/F2/F3../F8
類比終端:xterm, gnome terminal
1. 任務管理命令:
&: 最經常被用到,這個用在一個命令的最後,可以把這個命令放到後台執行
ctrl + z:可以將一個正在前台執行的命令放到後台,並且暫停
jobs:查看當前有多少在後台啟動並執行命令
fg:將後台中的命令調至前台繼續運行,如果後台中有多個命令,可以用 fg %jobnumber將選中的命令調出,%jobnumber是通過jobs命令查到的後台正在執行的命令的序號(不是pid)
bg:將一個在後台暫停命令,變成繼續執行,如果後台中有多個命令,可以用bg %jobnumber將選中的命令調出,%jobnumber是通過jobs命令查到的後台正在執行的命令的序號(不是pid)
2.檔案和目錄操作
(1). 檔案清單
ls -l -h -a -s
(2). 建立檔案/目錄
touch -a access time
-m modify time
-t time stamp
mkdir -p
(3). 複製檔案/目錄
cp -r(遞迴複製檔案) -v -p(保留檔案屬性)
-R(遞迴複製目錄)
-l(建立永久連結檔案)
-s(建立軟串連)
(4). 重新命名
mv -v
(5). 刪除檔案/目錄
rm -r -v -f
rmdir
(6). 查看檔案內容
cat -n(編號)
vi,od(二進位),more,less,tail,head
nl(為輸出加上行號)
stat(檔案統計資料)
file(檔案類型)
3.進程管理
(1). 進程查看
ps -aux
ps -l
ps -efH
top
(2)進程管理
kill
(3) 查看磁碟
mount -o loop
umount
df -h -l
du -c -h -s -a
(4) 資料排序
sort -n(進行數值排序)
-r(逆序)
(5)搜尋資料
grep -n(顯示匹配行號)
-v(反轉搜尋)
-c(統計匹配數)
-e(指定多個匹配)
4. 環境變數
(1). 建立全域環境變數
export
(2). 移除全域環境變數
unset
(3). 預設的環境變數
HOME,HOSTNAME,PATH,IFS(用於分割欄位的字元列表),OPTARG,OPTIND
(4). 登入shell
當登入到Linux系統時,bash shell將作為登入shell啟動.登入shel將尋找4個不同的開機檔案來處理其中的命令.
bash shell中處理檔案的順序如下:
/etc/profile
~/.bash_profile
~/.bash_login
~/.profile
即先執行/etc/profile,接著檢查使用者的目錄中是否有.bash_profile,.bash_login或.profile其中之一.
當執行新的shell時, 如果是執行互動shell,例如直接執行bash,bash會執行/etc/bashrc檔案,然後檢查使用者目錄中的.bashrc
如果非互動式(shell script),bash shell會去執行BASH_ENV環境變數的內容.
5.shell中數學計算
(1)count=1;count=$[ $count+1 ]
(2) let i=i+1;(( i=i+1 ))
(3)var=1;var=`expr $var + 1`
第4章 Linux中的許可權管理
常用的命令:
useradd用於添加新使用者
userdel刪除使用者,但是只刪除/etc/passwd中的使用者資訊,不會刪除賬戶在系統中擁有的任何檔案
passwd 修改賬戶密碼
chsh 修改預設shell
groupadd 添加使用者組
chmod 修改許可權
chown 修改所有者
chgrp 修改使用者組
第10章 結構化命令
(1) if-else
數值比較:-eq,-ge,-gt,-le,-lt,-ne
字串比較:=,!=,<,>,-n,-z
檔案比較:-e,-d,-f,-r,-w,-x,-s
複合條件檢查:&&,||
(2)case
(3)for,while,until
(4)break,continue
第11章 處理使用者輸入輸出
(1)命令列參數
位置參數:$0程式名稱,$1第一個參數,$2第二個參數...
basename,dirname
$#命令列參數個數
$*所有參數作為一個對象
$@所有參數作為多個對象
(2)處理選項
利用case語句的形式
shift位移參數
getopt命令接受任意形式的命令選項和參數列表,並自動將這些選項和參數轉換為適當的格式.
如:getopt ab:cd -a -b test1 -c -d test2 test3
set命令的一個選項是雙破折號,將命令列參數變數替換為set命令的命令列中的值.
比如:set -- `getopt ab:cd -a -b test1 -c -d test2 test3`
getopts命令為在命令列中找到的所有待處理的選項和參數產生一個輸出,並且順序的對現有的shell參數變數進行處理
同時利用到了兩個環境變數OPTARG和OPTIND.OPTARG中包含需要參數值的選項要使用的值;OPTIND包含的值表示getopts停止處理時在參數列表中的位置.
(3)擷取使用者輸入
echo -n(不換行)
read 讀取輸入
-p 給出提示
-t 計時
-n1 指示read命令只需接受一個字元後就退出
-s 不回顯
(4)使用臨時檔案
linux中的/tmp目錄處理不需要永久儲存的檔案,在啟動時自動刪除/tmp目錄中的任何檔案
系統上的任何使用者賬戶都有權讀取和寫入/tmp目錄中的檔案.
mktemp testing.XXXXXX 建立本地臨時檔案
-t 強迫mktemp在/tmp中建立檔案
當mktemp建立臨時檔案時,它將完整路徑名返回給環境變數.
-d 建立一個臨時目錄
輸入輸出重新導向:
1.重新導向錯誤
ls -al badfile 2>test4 #將錯誤重新導向到檔案test4,這樣程式的錯誤就直接輸入到了檔案test4中,而在螢幕上看不到輸出。
2. 重新導向錯誤和資料
如果需要同時重新導向錯誤和普通資料,則必須使用兩個重新導向符號。必須在希望重新導向的資料前面放置相應的檔案描述符,然後將他們指向相應的輸出檔案以儲存資料
如:
ls -al test test3 badfile 2>test6 1>test7
這是將錯誤重新導向到test6檔案,將標準輸出STDOUT重新導向test7檔案
其實,也可以將STDEER和STDOUT重新導向到同一個檔案,使用&>符號,如:
ls -al test test2 test3 badfile &> test7
這樣,錯誤和標準輸出都定向到test7檔案中了。
3. 臨時重新導向
如:
echo "This is an error" >&2 #將這句重新導向到了標準錯誤
4. 永久重新導向
exec 1>testout 在指令碼執行期間,將標準輸出重新導向到testout
exec 2>testerror 在指令碼執行期間,將標準錯誤重新導向到testerror
但是這樣存在的一個問題是重新導向STDOUT和STDERR之後,就無法再將他們重新導向到原來的位置。
exec 0<testfile 在指令碼執行期間,將testfile重新導向到標準輸入
5. 輸出檔案描述符。shell中最多有9個開啟的檔案描述符,其他6個是3~8
exec 3>test13out
echo "and this" >&3
將數字3重新導向到test13out檔案,這樣上面echo後面的一句就輸入到了test13out檔案。
6. 恢複重新導向檔案描述符
exec 3>&1
exec 1>test14out
echo "dsafadsfasdf"
exec 1>&3
這樣 先將檔案描述符3重新導向到標準輸出,然後將標準輸出重新導向到檔案test14out,之後再把檔案描述符1重新導向到3,這樣1就恢複了原來的STDOUT了。這兒檔案描述符3相當於一個臨時變數來儲存標準輸出STDOUT
類似輸入檔案描述符如下:
exec 6<&0
exec 0<testfile
....
exec 0<&6
7. 建立讀取/寫入檔案描述符
確實可以為輸入和輸出開啟同一個檔案描述符,可以使用同一個檔案描述符從一個檔案讀取資料,同時向這個檔案寫入資料
exec 3<>testfile
輸入輸出都定向到了testfile檔案。
8. 關閉檔案描述符
要關閉檔案描述符,將它重新導向特殊符號&-
如:exec 3>&-
第13章 指令碼 指令碼控制
mktemp testint.XXXXXX 建立臨時檔案
-t 選項強迫mktemp在系統臨時檔案夾中建立臨時檔案
-d mktemp建立一個臨時目錄
tee命令可以將STDIN的資料同時發送到STDOUT和其所指定的檔案
建立函數
return 命令以特定退出狀態退出函數。return命令可以使用單個整數值來定義函數退出的狀態,提供了一種通過編程設定函數退出狀態的簡單方法。
必須注意兩個容易發生的錯誤:
(1)請記住在函數完成之後儘快提取傳回值。
(2)請記住退出狀態的取值範圍是0~255
第15章 在指令碼中使用顏色