shell腳本
簡介:
使用腳本編程語言的好處是,它們多半運行在比編譯型語言還高的層級,能夠輕易處理文件與目錄之類的對象。缺點是:它們的效率通常不如編譯型語言。不過權衡之下,通常使用腳本編程還是值得的:花一個小時寫成的簡單腳本,同樣的功能用C或C++來編寫實現,可能需要兩天,而且一般來說,腳本執行的速度已經夠快了,快到足以讓人忽略它性能上的問題。因為Shell似乎是各UNIX系統之間通用的功能,并且經過了POSIX的標準化。因此,Shell腳本只要“用心寫”一次,即可應用到很多系統上。因此,之所以要使用Shell腳本是基于: 簡單性:Shell是一個高級語言;通過它,你可以簡潔地表達復雜的操作。 可移植性:使用POSIX所定義的功能,可以做到腳本無須修改就可在不同的系統上執行。 開發容易:可以在短時間內完成一個功能強大又妤用的腳本。
編程基礎:
-
程序:指令+數據
-
程序編程風格:
過程式:以指令為中心,數據服務于指令
對象式:以數據為中心,指令服務于數據
-
shell程序:提供了編程能力,解釋執行
程序的執行方式:
-
計算機:運行二進制指令;
-
編程語言:
低級:匯編
高級:
編譯:高級語言–>編譯器–>目標代碼 如:java,C#
解釋:高級語言–>解釋器–>機器代碼 如:shell, perl, python
編程基本概念
-
編程邏輯處理方式:
順序執行 (一步一步執行)
循環執行 (循環重復一種命令直到條件滿足退出循環)
選擇執行 (條件判斷懸著執行某些命令)
-
shell編程:過程式、解釋執行
編程語言的基本結構:
數據存儲:變量、數組
表達式: a + b
語句:if
shell腳本基礎
shell腳本是包含一些命令或聲明,并符合一定格式的文 本文件
格式要求:首行shebang機制 #!/bin/bash
創建shell腳本
第一步:使用文本編輯器來創建文本文件
第一行必須包括shell聲明序列:#! 如:#!/bin/bash
添加注釋 注釋以#開頭
第二步:運行腳本
給予執行權限
腳本調試
bash -n /path/to/some_script 檢測腳本中的語法錯誤
bash -x /path/to/some_script 調試執行
變量
-
變量:命名的內存空間
-
作用:
1、數據存儲格式
2、參與的運算
3、表示的數據范圍 類型: 字符 數值:整型、浮點型
-
變量命名法則:
1、不能使程序中的保留字:例如if, for;
2、只能使用數字、字母及下劃線,且不能以數字開頭
3、見名知義
4、統一命名規則:駝峰命名法
1、本地變量
變量賦值:name=‘value’,
可以使用引用value:
(1) 可以是直接字串; name=“root"
(2) 變量引用:name="$USER"
(3) 命令引用:name=`COMMAND`, name=$(COMMAND)
變量引用:${name}, $name
"":弱引用,其中的變量引用會被替換為變量值
'':強引用,其中的變量引用不會被替換為變量值,而保 持原字符串
顯示已定義的所有變量:set
刪除變量:unset name
2、環境變量
變量聲明、賦值:
export name=VALUE
declare -x name=VALUE
變量引用:$name, ${name}
顯示所有環境變量:
export
env
printenv
刪除:unset name
bash有許多內建的環境變量:PATH, SHELL, USRE,UID, HISTSIZE, HOME, PWD, OLDPWD, HISTFILE, PS1
3、位置變量
shell腳本之位置變量:
$0 腳本的名稱
$1,$2,$3…. 第一個參數,第二個參數,第三個參數
shift 每shift一次,參數位置往前一個($2–>$1,$3—>2,…)
shift N 往前的移動是N個
shell腳本之特殊變量:
$? 上一次執行的狀態碼
$# 參數個數
$* 參數列表
$@ 參數列表
腳本:
驗證位置變量和特殊變量:
#!/bin/bash
echo $0 命令本身
echo "the number of values is $#" 腳本參數個數
echo $* 腳本參數列表
echo $@ 腳本參數列表
echo $1 第一個參數
echo $3 第三個參數
腳本
執行結果
[root@localhost ~]# /testdir/bin/ceshi.sh 1 2 3 4 5
/testdir/bin/ceshi.sh $0,命令本身
5 參數個數
1 2 3 4 5 參數列表并作為一個字符串,所以這個結果只有一個參數了
1 2 3 4 5 參數列表并每個參數獨立出來,所以這個結果還是有五個字符串
1 第一個參數
3 第三個參數
作業實例:
1、編寫腳本/root/bin/systeminfo.sh,顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小。
主機名:hostname
IPv4地址:ifconfig | grep 'inet\b' | grep -v '127.0.0.1' | tr -s ' ' | cut -d' ' -f3
操作系統版本:cat /etc/redhat-release
內核版本:uname -r
CPU型號:lscpu | grep -i "型號名稱:"
內存大?。篺ree -h | sed -n '2p' | tr -s ' ' | cut -d' ' -f2
硬盤大小:fdisk -l|sed -n '2p'|cut -dG -f1|grep -o [[:digit:]].*\.
2、編寫腳本/root/bin/backup.sh,可實現每日將/etc/目錄備份到/root/etcYYYY-mm-dd中
備份至目:/root/etc$(date +%F)
3、編寫腳本/root/bin/disk.sh,顯示當前硬盤分區中空間利用率最大的值
顯示當前硬盤分區中空間利用率最大的值:df | grep '/dev/sd' | tr -s ' ' | sort -nr -t' ' -k5 | head -1 | cut -d' ' -f5
4、編寫腳本/root/bin/links.sh,顯示正連接本主機的每個遠程主機的IPv4地址和連接數,并按連接數從大到小排序
顯示并排序netstat -nt | tr -s ' ' | cut -d' ' -f5 | tr -cs '0-9.' '\n' | egrep '([0-9]+.){3}[0-9]+' | sort | uniq -c | sort -nr | tr -s ' ' '\t'
5、寫一個腳本/root/bin/sumid.sh,計算/etc/passwd文件中的第10個用戶和第20用戶的ID之和
切出uid并做加法
顯示出來
6、寫一個腳本/root/bin/sumspace.sh,傳遞兩個文件路徑作為參數給腳本,計算這兩個文件中所有空白行之和
取兩個文件內的空行數并做加法
6、寫一個腳本/root/bin/sumfile.sh,統計/etc, /var, /usr目錄中共有多少個一級子目錄和文件
統計/etc, /var, /usr目錄中共有多少個一級子目錄和文件
總數
7、寫一個腳本/root/bin/argsnum.sh,接受一個文件路徑作為參數;如果參數個數小于1,則提示用戶“至少應該給一個參數”,并立即退出;如果參數個數不小于1,則顯示第一個參數所指向的文件中的空白行數
8、寫一個
腳本/root/bin/hostping.sh,接受一個主機的IPv4地址做為參數,測試是否可連通。如果能ping通,則提示用戶“該IP地址可訪問”;如果不可ping通,則提示用戶“該IP地址不可訪問”
9、chmod -rw /tmp/file1,編寫腳本/root/bin/per.sh,判斷當前用戶對/tmp/fiile1文件是否不可讀且不可寫
10、編寫腳本/root/bin/nologin.sh和login.sh,實現禁止和充許普通用戶登錄系統。
11、寫一個腳本/root/bin/hostping.sh,接受一個主機的IPv4地址做為參數,先判斷是否合格IP,否,提示IP格式不合法并退出,是,測試是否可連通。如果能ping通,則提示用戶“該IP地址可訪問”;如果不可ping通,則提示用戶“該IP地址不可訪問”
12、計算1+2+3+…+100的值
13、計算從腳本第一參數A開始,到第二個參數B的所有數字的總和,判斷B是否大于A,否提示錯誤并退出,是則計算之
原創文章,作者:502795641,如若轉載,請注明出處:http://www.www58058.com/35451
文章整體思路清晰,排版精美,內容充實飽滿