標籤:linux shell shell指令碼 shell
一、初識指令碼 shell:一類介於系統核心與使用者之間的解釋程式。
指令碼:一類使用特定語言,按預設順序執行的檔案
批處理、宏、解釋型程式
建立shell指令碼:
理清任務過程--整理執行語句--完善檔案結構
1.任務目標 1.按任務順序 1.執行環境
2.先做什麼 2.必要的結構控制 2.必要的注釋資訊
3.再做什麼 3.如何免互動 3.友好的提示
4.每一步如何?
例子:
1)理清任務過程
1.添加一個名為zhangsan的使用者
添加一個名為zhangsan的使用者
useradd zhangsan
2.將使用者zhangsan的口令設定為123456
passwd zhangsan
2)整理執行語句
useradd zhangsan
echo 123456| passwd --stdin zhangsan
3)完善檔案結構
指令檔:uad.sh
#!/bin/bash
#2015-04-12,by Moon
echo "正在建立使用者帳號zhangsan..."
useradd zhangsan
echo "正在為使用者zhangsan設定密碼..."
echo 123456|passwd --stdin zhangsan
echo "建立成功。"
4)執行shell指令碼
方法:1. chmod +x uad.sh
./uad.sh
2. sh/bash uad.sh
3. source/. uad.sh
二、shell命令的組合運用管道操作:將一端的命令輸出交給另一端的命令處理 方向:單向
格式:命令1|命令2
例子:
1.
find /etc -name "*.conf" -type f //尋找以.conf結尾的檔案
/etc/autofs_ldap_auth.conf
.. ..
find /etc -name "*.conf" -type f | wc -l //wc統計 -l按行統計
308
2.
ps aux | grep httpd //gerp 過濾只剩與httpd相關的資訊
重新導向:改變執行命令時的預設輸入、輸出
類型 | 操作符 |用途
重新導向輸入 |< |從指定檔案讀取資料,而不是從鍵盤輸入
重新導向輸出 | >、>> |將輸出結果覆蓋、追加到指定檔案
標準錯誤輸出 |2>、2>> |將錯誤資訊覆蓋、追加到指定檔案
混合輸出 |&>、&>> |將標準輸出和錯誤資訊覆蓋、追加到指定檔案
例子:
1.
uname -r //linux 核心版本資訊
2.6.18-194.el5
uname -r > version.txt //版本資訊儲存到了version.txt
2.
cat version.txt version2.txt
2.6.18-194.el5
cat:version2.txt:沒有那個檔案或目錄
cat version.txt version2.txt 2>error.txt //把錯誤資訊儲存到error.txt中
2.6.18-194.el5
cat error.txt
cat:version2.txt:沒有那個檔案或目錄
邏輯分隔:處理多條命令之間的邏輯關係
邏輯與:&&
邏輯或:||
順序執行::
例子:
1.
echo "蘿蔔" && echo "白菜"
蘿蔔
白菜
echo "蘿蔔"||echo "白菜"
2.
mkdir /mulu/a 2>/dev/null && echo "成功"
mkdir /mulu/a 2>/dev/null ||echo "失敗"
失敗!
3.
cd /boot/grub:ls -lh grub.comf //-h意味著便於人操作
三、使用變數1.變數基本操作:
定義與賦值:格式:變數名=變數名
引用變數:格式:$變數名 、${變數名}
例子:
Title = Moon
echo $Title
Moon
2、定界符號
雙引號、單引號、反撇號
雙引號:允許引用,\轉義
單引號:禁止引用、轉義
反撇號,或者$()
以命令輸出進行替換
例子:
1.
echo "$Title group"
Moon group
echo ‘$Title group‘
$Title group
2.
uname -r
2.6.18-194.el5
Ver=`uname -r `
echo $ver
2.6.18-194.el5
3.常見的環境變數
用來記錄/設定運行參數
系統賦值:USER、LOGNAME、HOME、SHELL、......
使用者操作: PATH、LANG、CLASSPATH、.....
例子:
1.
env #列出所有環境變數
HOSTNAME=pc05.benet.com
SHELL=/bin/bash
HOME=/root
LOGNAM=root
.. ..
2.echo $USER $HOME SHELL
zhangsan /root SHELL
echo $LANG
zh_CN.UTF-8
其他特殊變數:
由系統或指令碼操控,不可直接賦值:
$?:前一條命令的狀態值,0為正常、非0異常
$0:指令碼自身的程式名或路徑
$1-$9:第一-第九個位置命令的參數
$* :命令列的所有位置參數的內容
$#:命令列的位置參數個數
例子:
1.
mkdir /mulua
echo $?
0
mkdir /mulu/a
mkdir:無法建立目錄 “/mulu/a”:沒有那個檔案或目錄
echo $?
1
2.
cat test.sh
#!/bin/bash
echo “本程式名:$0”
echo "執行時一共輸入$#個位置參數"
echo “其中第一個參數是:$1”
echo “所有參數如下:$*”
./test.sh Hello Everyday!
本程式名:./test.sh
執行時一共輸入2個位置參數
其中第一個參數是:Helo
所有參數如下:Hello Everyday!
四、數值運算及處理1.整數運算操作:
使用expr命令,計算運算式
格式:expr 數值1 操作符 數值2
使用$[]運算式,算式提換
格式:$[數值1 操作符 數值2]
例子:
1.
expr 45+21
66
expr 45-21
23
expr 45\*21 #shell 中 把* 當成萬用字元,所以應該轉義下
945
expr 45/21
2
expr 45%21
3
X=45;Y=21;expr $X-$Y
24
2.
echo $[45+21]
66
echo $[45*21]
945
X=45;Y=21;echo $[X-Y]
24
2.幾個數值處理技巧
變數的遞更處理
格式:let 變數名++、 let變數名--
使用隨機數
RANDOM 變數
產生數字序列
格式:seq 首數 末數、 seq 首數 增量 末數
例子:
1.
X=45;Y=21
let X++;echo $X
46
let Y--;echo $Y
20
let X+=2;echo $X
48
2.
echo $RANDOM #RANDOM 變數的取值範圍為0-32767
4411
echo $RANDOM
26911
echo $[RANDOM%100]
54
echo $[RANDOM%100]
83
3.
seq 3 #第一個數是從1 開始的 1 可以省略
1
2
3
seq 3 5
3
4
5
seq 3 2 10
3
5
7
9
小數運行操作:
將運算式給bc命令處理
例子:
echo “45.67-21” | bc
24.62
echo "scale=4;10/3" | bc #通過scale來約束小數位
3.3333
Linux shell 指令碼(一)