1. Linux shell中, 可以將linux 中的命令放入到 xxx.sh文件中, 構成一個shell腳本。
2. Linux 管道表示 “ | ” , 例如 A | B , 即是將A 命令執行的結果, 做爲傳入, 給B命令執行, 例如: ls -l | grep http , 意思爲:顯示當前目錄下所有文件, 過濾出包含“http”字符的文件。
3. 重定向: < , > , >> , < 是將 < 右邊的作爲左邊的輸入, > 是重新寫入, 通常是到文件中 “ls -l > a.txt ” , >> 是追加操作, 將數據從文件的末尾添加上去, 不從文件的頭部開始寫。
2> 就是將命令中錯誤的信息重新定向 , 還有類似的 2>> , 此爲追加操作。
0表示標準輸入 ,1表示標準輸出 ,2表示標準錯誤輸出 ,> 默認爲標準輸出重定向,與1> 相同 , 2>&1 意思是把標準錯誤輸出重定向到標準輸出。 &>file表示標準輸出和標準錯誤輸出都重定向到文件file中。
4. 命令協作: &&, || , ; && 兩個命令都需要執行成功, || 如果前面的命令執行成功, 則不執行後面的命令 , 跟C語言中的類似。 ; 表示, 前面的命令執行完後, 緊接着執行後面的命令。
5. 變量定義
Linux shell 可以直接定義變量, 形式爲 變量名 = 變量值 , 如果 hello = haha , 如果要利用該變量的值,在前面需要添加上 $hello 來取到變量的值。測試例子:
命令行中: hello = haha 回車 echo $hello 顯示 haha (賦值時, = 號前後最好不要留有空格)
6 . 雙引號 , 和 單引號 , 反撇號(鍵盤1左邊的那個按鍵)
雙引號中是允許有引用的如在雙引號中有開始定義的$hello , 則在執行過程中 會當作haha 來處理, 如果使用單引號擴起來的, 則會直接輸出, 不管是否是引用。
echo "$hello" 顯示 haha 而 echo '$hello' 顯示 $hello 。反撇好, 包含的內容不是字符串, 而是一個命令, 可將其包含的` `執行後的結果, 做其他用, 比如賦值。
7 . 由系統或腳本控制,不可直接賦值的特殊變量
$? : 前一條命令的狀態值, 0 爲正常 , 非0異常
$0 : 腳本自身的程序名
$1 - $9 : 第1-第9個位置參數
$* : 命令行的所有位置參數的內容
$# : 命令行的位置參數個數
8 . 計算表達式, 可以用expr 命令 , 格式是 expr 數值1 操作符 數值2 或者 使用 $[] , 格式是 $[數值1 操作符 數值2] , 例如:kkk = `expr 1 + 3 ` echo $kkk 顯示4 , 而 $[1 + 3] , 這個結果會替換這個式子本身 , 也是4 。在expr使用 * 的時候, 我們需要用一個 \* , 因爲 * 在linux 系統中是通配符。而在利用 $[]的時候, 無需要轉義。
9 . let 變量名++ , let 變量名-- , 變量的遞更處理。 也可以這樣用 X+=2 。 RANDOM是一個特殊的變量, 它可以生成隨機數。seq 可以生成數字序列, 用法爲:
seq 首數 末數 , 生成首數到末數之間的數, 如果首數沒有指定, 則從1開始到末數, 步長默認爲1 ,例如:seq 3 , 則顯示 1 2 3 。還有一種語法是 seq 首數 步長 末數 , 這樣就顯示從首數開始遞增加步長, 直到超過末數。 用bc 來做小數處理,例如: echo "45.67-21.45" | bc , 由於小數在除法的過程中可能會出現無限循環的小數, 則我們需要有時候需要限制小數的小數位數, 例如: echo “scale =4; 10/3 ” | bc 利用 scal=n 來指定位數。
10 . 字符串截取操作
dirname 命令, 顯示文件的文件夾位置, basename命令, 顯示文件的文件名。expr substr $var1 起始位置 截取長度 , 還可以使用 ${}表達式, 來截取字符串格式: ${var1:起始位置:截取長度}。expr 截取的起始位置是從1開始編號的, 而 $var的起始位置是從0開始編號的。所以在使用這兩個字符串截取時候,需要注意相差一位。$截取時,如果起始位置省略,就從頭開始截取, 寫法爲${var::4}。
11. 字符串替換
格式一:${var/old/new} ,將var變量值中第一個old字符串用new來替換 ,格式二: ${var//old/new} ,將var變量值中的所有的old都用new來替換。
12. 測試操作規範: test 條件表達式 或者 [條件表達式] 。
13. 存在及識別 : -e : 目標是否存在(Exist) -d: 是否爲目錄(Directory) -f :是否爲文件(File) 。權限的檢測 : -r :是否有讀取(Read)權限 ,-w : 是否有寫入(Write) 權限
-x : 是否有可執行(eXcute)權限。整數值比較: -eq:等於(Equal) , -ne : 不等於(Not Equal) , -gt: 大於(Greater Than),-lt : 小於(Lesser Than) , -ge : 大於或等於(Greater or Equal) , -le: 小於或等於(Lesser or Equal)。例如:[$(who | wc -l) -eq 2 ] && echo "yes" 。
14. 單分支if語句結構: 雙分支if語句結構: 多分支if語句結構
if 條件測試 if 條件測試 if 條件測試1
then 命令序列 then 命令序列1 then 命令序列1
fi else 命令序列2 elif 條件測試2
fi then 命令序列2
.........
else 命令序列n
fi
15 . for 循環語句格式:
for 變量名 in 取值列表
do
命令序列
done
16 . case 語句格式:
case 變量值 in
模式1 )
命令序列1
;;
模式2 )
命令序列2
;;
* )
默認命令序列
esac
17 . 如果腳本需要被系統調用chkconfig來管理, 首先需要能夠識別start | stop 命令, 對於有些系統red hat centOS ,
需要在普通的shell腳本開頭添加chkconfig的相關參數:
#/bin/bash
#chkconfig -90 10
#description: 描述的語句
我們還需要將我們的腳本放到/etc/init.d/下面, chkconfig --add 腳本 , 添加後chkconfig就能夠管理這個shell服務腳本了。
舉例說明shell文件名爲(shelllinux):
#!bin/bash
#chkconfig -90 10
#description: this is my shell!
case "$1" in
start)
echo "start";
`ls >> /usr/start.txt` ;
sleep 3600 &
;;
stop)
echo "stop"
pkill -x "sleep"
;;
*)
echo "you can [start|stop]"
esac
然後將,shelllinux文件放入到/etc/init.d/下面, chkconfig --add shelllinux ,OK ,搞定了!如果想要開機自動運行, 就chkconfig shelllinux on 。
對於ubuntu, 它沒有chkconfig , 我們可以用update-rc.d 命令來。
添加的頭block是這樣的:
#!/bin/bash
### BEGIN INIT INFO
# Provides: scriptname
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start daemon at boot time
# Description: Enable service provided by daemon.
### END INIT INFO
再執行update-rc.d shelllinux defaults 這樣重啓過後,我們的腳本就會在系統啓動的時候加載執行了,判斷腳本是否執行,觀察case start), 後面執行命令序列的效果。
如果不希望執行只需要update-rc.d -f shelllinux remove 即可!瞭解更多,請了解運行級別。
18 . awk基本命令格式:
awk '模式 {操作}' 文件1 文件2 例如:awk 'NR==1{print}' /etc/hosts, 就會顯示第一行/etc/hosts
awk命令有很多的內置變量:
NR :當前處理行的序數(行號)
FS : 字段分隔, 缺省爲空格或Tab位
$n : 當前行的第n個字段
$0 : 當前行的所有文本內容
示例文本(file.txt):
1 This is the first line.
2 Hello, Everybody!
3 192.168.4.2 sss.eee.yyy
4 hunter:x:504:504::/home/sely:/bin/bash
命令行中執行:awk 'NR==1,NR==3{print}' file.txt 就會顯示從第1行到第3之間的所有內容。
1 This is the first line.
2 Hello, Everybody!
3 192.168.4.2 sss.eee.yyy
命令行中執行:awk '(NR==1)||(NR==3){print}' file.txt 就會顯示
1 This is the first line.
3 192.168.4.2 sss.eee.yyy
還可以按照奇偶行來輸出: awk '(NR%2)==0{print}' file.txt 顯示如下
2 Hello, Everybody!
4 hunter:x:504:504::/home/sely:/bin/bash
awk 還可以使用正則表達式, 用/ /包含出來。 awk '/2/{print}' file.txt (打印所有包含2字符所在的行)
2 Hello, Everybody!
3 192.168.4.2 sss.eee.yyy
awk '/bash$/{print}' file.txt (打印所有包含以bash結尾的行, 這裏的$符號是表示結尾的意思)
4 hunter:x:504:504::/home/sely:/bin/bash
指定輸出字段: awk 'NR==2,NR==3{print $1,$3}' file.txt
2 Hello, Everybody!
3 192.168.4.2 sss.eee.yyy
指定按照字符分隔用法: awk -F. '$5=="eee"{print $0}' file.txt (-F指定分隔符這裏是“ . ” , 指定第五個字段爲"eee“ ,就輸出整行)
3 192.168.4.2 sss.eee.yyy
19 . seb 語法格式:
sed '編輯指令' 文件1 文件2 .....
sed -n '編輯指令' 文件1 文件2 ....
sed -i '編輯指令' 文件1 文件2 ....
例如: sed -n '3,5p' /etc/hosts (將/etc/hosts內容中的第3行到第5行p=print出來)。
編輯指令的寫法: 格式:[地址1[,地址2]] 操作類型, 多條指令之間以分號隔開。 sed -n '3p;5p' /etc/hosts (輸出第3行和第5行)。如果多個單引號區間, 則他們之間需要加上 -e隔開。常用的操作類型有:
p 輸出/打印文本行 n 取下一行文本(跳過當前行) d 刪除 s 字符串替換 a 追加新的文本。
爲了測試sed 命令,我們同樣建立個file.txt文本:
1 This is the first line.
2 Hello, Everybody!
3 192.168.4.2 sss.eee.yyy
4 hunter:x:504:504::/home/sely:/bin/bash
輸出所有的奇數行: sed -n 'p;n' file.txt
1 This is the first line.
3 192.168.4.2 sss.eee.yyy
輸出所有的偶數行: sed -n 'n;p' file.txt
2 Hello, Everybody!
4 hunter:x:504:504::/home/sely:/bin/bash
使用正則表達式: sed -n '/eee/,$p' file.txt (輸出eee所在的行到最後一行的內容)
3 192.168.4.2 sss.eee.yyy
4 hunter:x:504:504::/home/sely:/bin/bash
使用正則表達式查找單詞所在的行: sed -n '/\<This\>/p' file.txt (\是用來轉義<和>的)
1 This is the first line.
刪除符合條件的行: sed '2,3d' file.txt (會將file.txt中的第2行到第3行之間的內容刪除後,顯示出剩下的文本,不會涉及到file.txt的實際內容)
1 This is the first line.
4 hunter:x:504:504::/home/sely:/bin/bash
刪除符合條件的行和最後一行: sed '/eee/d;$d' file
1 This is the first line.
2 Hello, Everybody!
刪除不符合條件的行: sed '/eee/!d' file.txt 如果在前面加 -i 就會影響到文件的內容。
3 192.168.4.2 sss.eee.yyy