字串比較時變量最好使用""
這樣就不會報錯了,只是退出碼不為0
組合條件:
與:[ condition1 -a condition2 ]或condition1 && condition2
或:[ condition1 -o condition2 ]或condition1 || condition2
非:[ -not condition ]或者 ! condition
練習:如果當前主機的主機名為空,或為'localhost',將其修改為www.magedu.com
練習:如果某用戶存在,且answer變量的值為"yes",則顯示用戶的id號,否則,說用戶選擇了退出
if id $userName &> /dev/null && [ "$answer" == "yes" ];then
…
fi
練習:給定一個用戶,如果其shell為/bin/bash,且其id號大于等于500,則說明這是一個可登陸普通用戶,否則,顯示其為非登陸用戶或管理員
寫腳本:
1、查看傳遞參數個數
2、判斷參數類型等
3、邏輯等
練習:
如果某用戶不存在,則添加之
練習:
1、添加10個用戶,如果用戶不存在,則添加,如果存在就顯示已經有此用戶
2、顯示一共添加了多少個用戶
練習:
1、添加10個用戶,如果用戶不存在,則添加并以綠色顯示添加成功,如果存在就顯示已經有此用戶并以紅色顯示
2、顯示一共添加了多少個用戶
文件測試:
-a file:文件存在則為真
-e file:文件存在則為真
以上兩者可能是文件、目錄、鏈接
-f file:文件存在并且是普通文件則為真
-d file:存在并且為目錄文件則為真
-h/L file:存在并且為符號鏈接則為真
-b file:存在并且為塊設備則為真
-c file:存在并且為字符設備則為真
-S file:存在并且為套接字則為真
-p file:存在并且為管道則為真
-s file:存在并且為非空文件則為真
-r file:存在并且可讀則為真
-w file:存在并且可寫則為真
-x file:存在并且可執行則為真
-N file:存在并且mtime比atime新
file1 -nt file2:file1比file2新則為真
file1 -ot file2:file1比file2舊則為真
file1 -ef file2:file1比file2新則為真
練習:如果wget命令對應的可執行文件存在且可執行,則使用它下載http://172.16.0.1/centos6.5.repo至當前目錄中
練習:給定一個文件路徑,判斷此文件是否存在,不存在則說明文件不存在直接結束腳本;如果文件是一個普通文件,則顯示為“regular file”,如果文件是目錄,則顯示為“directory”,如果文件是鏈接文件,則顯示為“symbolic file”,否則顯示為“unknown”
練習:腳本完成以下任務
1、分別復制/var/log下的文件至/tmp/logs目錄
2、復制目錄時,才使用cp -r
3、復制文件,使用cp
4、復制鏈接,使用cp -d
5、余下的類型,使用cp -a
寫一個腳本,完成如下任務,其使用形式如下所示:
script.sh {start|stop|restart|status}
其中:
如果參數為空,則顯示幫助信息,并退出腳本;
如果參數為start,則創建空文件/var/lock/subsys/script,并顯示“starting script successfully.”
如果參數為stop,則刪除文件/var/lock/subsys/script,并顯示“Stop script successfully.”
如果參數為restart,則刪除文件/var/locksubsys/script并重新創建,而后顯示“Restarting script successfully.”
如果參數為status,那么:
如果文件/var/lock/subsys/script存在,則顯示“Script is running…”,否則,則顯示“Script is stopped.”
說明:script.sh是腳本文件名,在創建時,其名稱可以自己隨意定義,但如果其名稱發生變量,上/var/lock/sussys/下的文件名也要隨之而變;
交互編程:
read
-p:"提示"
-t:超時
例子:顯示一個如下菜單給用戶:
cpu) show cpu infomation
mem) show memory infomation
*) quit
1、如果用戶選擇了cpu,則顯示/proc/cpuinfo文件的內容;
2、如果用戶選擇了mem,則顯示/proc/meminfo文件的內容;
3、退出
或者
生成菜單第二種方法更易用
字符串中的模式匹配:
=~:模式匹配
用法:[[ "$var" =~ pattern ]]
例如:讓用戶給定一個用戶名,判斷其是否擁有可登錄shell;
練習:寫一個腳本,完成如下功能
使用格式:
script.sh /path/to/somefile
1、可接受一個文件路徑參數:
如果此文件不存在,則創建之,則自動為其生成前n行類似如下:
#!/bin/bash
# description:
# version:
# date:
# author: mageedu
# license: GPL
而后使用vim打開此文件,并讓光標處在最后一行的行首
如果文件存在、且是bash腳本,則使用vim打開之,光標自動處行最后一行的行首;
否則,退出;
如果正常編輯保存,
判斷,如果文件沒有執行權限,則添加之;
判斷,其是否有語法錯誤,如果有,提示;
while和until循環:
for循環劣勢:
1、先要在內存中生成列表,如果列表很大,就很占內存
2、循環次數不定,無法適合這種場景
while適用于循環次數位置或不便用for直接生成較大的列表時
格式:
1、次數已知
while 測試條件;do
循環體
done
如果測試條件為真,則進入循環;退出條件為,測試條件為假
declare -i count=1
while $count <= 100;do
循環體
let count++
done
until:
until 測試條件;do
循環體
done
如果測試條件結果為假,則進入循環,退出條件為,測試條件為真
練習:求100以內所有正整數之和
練習:求100以內所有偶數之和,使用取模方式實現
練習:提示用戶輸入一個用戶名,如果用戶存在,就顯示用戶的id號或shell,否則顯示用戶不存在,顯示完成之后不退出,再次重復前面的操作,直到用戶輸入q或quit為止
2、
循環高級:
for的第二種使用格式:
for ((初始條件;測試條件;修改表達式));do
循環體
done
練習:求100以內所有正整數之和
while的實現方式:
#!/bin/bash
declare -i count=1
declare -i sum=0
while [ $count -lt 100 ];do
let sum+=$count
let count++
done
echo $sum
for的實現方式:
#!/bin/bash
declare -i sum=0
for ((count=1;$count <= 100;count++));do
let sum+=$count
done
echo $sum
變量在賦值時都不用加$,在比較時需要加
練習:求100以內所有偶數之和
#!/bin/bash
declare -i sum=0
for ((count=2;$count <= 100;count+=2));do
let sum+=$count
done
echo $sum
while循環:遍歷文本文件
格式:
while read i;do
echo $i
done < file
練習:顯示id號為偶數的用戶的用戶名、id、shell
練習:顯示id號為偶數,且id號同gid的用戶的用戶名、id、shell
練習:顯示當前系統上所有掛載的文件系統中空間使用百分比大于10的文件系統
bash編程至case
寫一個腳本,使用格式:
1、start:創建/var/lock/subsys/script.sh
2、stop:刪除此文件
3、restart:先刪除文件,再創建文件
4、status:如果文件存在,顯示running,否則顯示stopped
case語句:有多個測試條件時,case語句會使得語法結構更明晰
case 變量引用 in
pattern1)
分支1
;;
pattern2)
分支2
;;
…
*)
分支n
esac
pattern:類同于文件名通配機制,但支持使用|表示或者
a|b:a或b
*:匹配任意長度的任意字符
?:匹配任意單個字符
[]:指定范圍內的任意單個字符
練習:用戶鍵入字符后判斷其所屬的類別
練習:寫一個腳本,對/etc/目錄及內部的所有文件打包壓縮
1、顯示一個菜單,讓用戶選擇使用的壓縮工具
xz)xz compress tool
gz)gzip compress tool
bz2)bzip2 compress tool
2、根據用戶選擇的工具,對/etc/執行相應的操作并保存至/backups目錄,文件形如/backups/etc-日期時間.tar.壓縮后綴
練習:寫一個腳本,使用形式如下
showifinfo.sh [-i interface|-a] [-v]
要求:
1、-i或-a不可同時使用,-i用于指定特定網卡接口,-a用于指定所有接口
顯示接口的ip地址
2、使用-v,則表示顯示詳細信息
顯示接口的ip地址、子網掩碼、廣播地址
3、默認表示僅使用-a選項
原創文章,作者:黑白子,如若轉載,請注明出處:http://www.www58058.com/47622