感悟 :
經過對文本處理工具grep,sed等內容的,以及vim文本編輯器的學習,馬不停蹄的又進行了對shell腳本的學習。對shell腳本的認識是可以保存在本地,用的時候只要執行相關腳本,簡短的命令就可以完成操作,可以用來應對日常重復性工作,有效提高系統管理員的效率,避免在重復性工作上花費不必要的時間。
*************************************************************************************
shell腳本的用途有:
自動化常用命令
執行系統管理和故障排除
創建簡單的應用程序
處理文本或者文件
示例
#!/bin/bash
#author:LH
#Version:1.0
#Description:This script displays some imformation about your system.
腳本編輯完成后,需要進行幾個步驟,確??梢哉_執行
1.chmod +x script或 bash script
2.bash -n script 檢查腳本中語法錯誤
3.bash -x 調試執行,按照腳本順序
變量 :實際就是命名的內存空間
編程語言分類
強類型 :定義變量時要指定類型,java,python等
弱類型 :無需提前指定類型,可直接調用
變量命名規則:
不能使用和保留字相同的名字
只能使用數字字母下劃線,數字不可開頭
見名知意
駝峰命名法:大小駝峰
變量種類
1.本地變量 作用范圍為當前shell進程,對其他進程,以及子shell無效
2.環境變量 作用范圍是當前shell及其子進程
3.局部變量 作用范圍為當前shell某段(一般是函數)
4.位置變量 $1 $2 $3 …用于讓腳本在腳本代碼中調用傳入的參數
5 特殊變量
$? 上次命令執行狀態
$0 在腳本內部引用腳本名稱本身
$# 傳遞給當前腳本的參數的個數
*************
$* 和$@:表面的意思相同,都是表示傳遞給當前腳本的所有參數
區別:
$* 把所有參數看做一條字符串
$@ 所有參數讓當做單獨的字符串
引用方式
變量引用 name="$USER",不可使用''
命令引用 name=`CMD` =$(CMD)
顯示所有變量 set
刪除變量 :unset name ,通常用于腳本末尾,釋放變量的命名空間,有利于內存合理使用
*********************************************
環境變量聲明、賦值
ecport name=value
declare -x name=VALUE
引用方式和本地變量相同
顯示所有環境變量:
export
env
printenv
刪除變量:unset name
bash 的內置環境變量
PATH 環境變量
SHELL
USER 當前用戶
UID 當前用戶UID
HISTSIZE 歷史命令保存數目
HOME
PWD 當前目錄
OLDPWD 前一個目錄
HISTFILE 歷史文件路徑
PS1
PPID 父目錄
只讀變量:只能讀,但不能修改刪除
》》》》》》》》》》》》》》》》》》》》》》
算數運算
** 乘方
實現
1.、let var=2+8 –>echo $var
2. echo '2+8'|bc
3. echo $[$RANDOM%50] 0-49間隨機數
賦值
let var++ 先賦值,再運算
let ++var 先運算,再賦值
+=自加,-=,*=,/= %=
邏輯運算:
與:都為1時,才為1
或:都為0時,才為0
短路運算:
與
或
異或
相同為假,相同為真
聚集命令,就是;連接,然后按照從左至右順序一個一個運行
條件性的執行操作符
&& – -AND THEN
|| – -OR ELSE
$ grep -q no_such_user /etc/passwd \
|| echo 'No such user' \為換行執行
*************************
數值測試
-gt
-ge
-lt
-le
-ne 是否不等于
-eq 是否等于
字符串測試
> ASCLL 是否大于
'string'=~ /pattern/ 左側字符串是否被右側PATTErn匹配到
-z "string" 字符串是否為空,空為真,不空為假
-n 與-z相反
文件測試
-e -a 文件存在為真,否為假
-L 是否存在且為符號鏈接文件
-p 管道文件
-S 是否存在且為套接字文件
文件權限測試
-r
-w
-x 是否存在且可執行
特殊權限測試
-g sgid
-u 是否存在且擁有suid
-k 是否存在sticky權限
文件大小測試
-s FILE:是否存在且非空
文件是否打開
-t fd 表示文件描述符是否已經打開且與某終端相關
-N FILE:文件自上次讀取之后是否被修改過
-O FILE 當前用戶是否為文件屬主
-G 是否為文件屬組
雙目測試:
FILE1 -ef FILE2:1和2是否指向同一個設備上的相同inode
組合條件測試
1.CMD1 && CMD 2 并且
CMD1 || CMD 2 或者
2.
-a 并且
-o 或者
必須使用測試命令 ,test
*************************************
*************************************
**********************************8**
練習
1、編寫腳本/root/bin/systeminfo.sh,顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小。
2、編寫腳本/root/bin/backup.sh,可實現每日將/etc/目錄備份到/root/etcYYYY-mm-dd中
3、編寫腳本/root/bin/disk.sh,顯示當前硬盤分區中空間利用率最大的值
4、編寫腳本/root/bin/links.sh,顯示正連接本主機的每個遠程主機的IPv4地址和連接數,并按連接數從大到小排序
netstat -nt |tr -s ' '|cut -d' ' -f5|tr -cs '0-9.' '\n'|egrep '([0-9]+.){3}[0-9]+'|uniq -c|sort -nr|tr -s ' ' '\t'
2 172.18.19.48
1 10.1.250.94
5、寫一個腳本/root/bin/sumid.sh,計算/etc/passwd文件中的第10個用戶和第20用戶的ID之和
echo `sed -n -e 10p -e 20p /etc/passwd|cut -d: -f3|tr '\n' +|sed -r 's@(.*)\+@\1@'`|bc
sed -n -e 10p -e 20p /etc/passwd
6、寫一個腳本/root/bin/sumspace.sh,傳遞兩個文件路徑作為參數給腳本,計算這兩個文件中所有空白行之和
6、寫一個腳本/root/bin/sumfile.sh,統計/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,實現禁止和充許普通用戶登錄系統。
[ -f /etc/nologin ] && echo "user disable login already" || (touch /etc/nologin; echo user disable login )
[ -f /etc/nologin ] && (rm -f /etc/nologin;echo user enable login) || echo user disable login already
11、寫一個腳本/root/bin/hostping.sh,接受一個主機的IPv4地址做為參數,先判斷是否合格IP,
否,提示IP格式不合法并退出,是,測試是否可連通。如果能ping通,則提示用戶“該IP地址可訪問”;如果不可ping通,則提示用戶“該IP地址不可訪問”
12、計算1+2+3+…+100的值
13、計算從腳本第一參數A開始,到第二個參數B的所有數字的總和,判斷B是否大于A,否提示錯誤并退出,是則計算之
原創文章,作者:000,如若轉載,請注明出處:http://www.www58058.com/34858