期待已久的腳本終于在這一周學到了,對于腳本,我感覺就是有兩點,第一:考驗一個人的思維能力,如果能把你想要的結果用腳本正確的表示出來。第二:以前學的基礎命令,怎么組合起來使用。達到以上兩點,再難寫的腳本都可以寫出來的。
一、編寫,執行一個腳本
腳本的格式
首行:#!/bin/bash (目前學到的就以這個開頭,相當于進入了下一級bash)
不是首行:帶#的都是注釋
不帶#的都是命令
規范的腳本
1、第一行一般為調用使用的語言
2、程序名,避免更改文件名為無法找到正確的文件
3、版本號
4、更改后的時間
5、作者相關信息
6、該程序的作用,及注意事項
7、最后是各版本的更新簡要說明
腳本的執行
需要給執行權限,在命令行上指定腳本的絕對或相對路徑
直接運行解釋器,將腳本作為解釋器程序的參數運行
二、腳本調試
檢測腳本中的語法錯誤
bash -n 腳本路徑
調試執行
bash -x 腳本路徑
三、變量
本地變量:僅對當前SHELL有效,對子SHELL也無效
直接輸入A=123 設置本地變量
set查看本地和環境變量
環境變量:對當前SHELL及其子SHELL均有效。
export A=121 設置環境變量
declare -x varname=value 也是設置環境變量
env查看環境變量
export
位置變量:$1, $2, …來表示,用于讓腳本在腳本代碼 中調用通過命令行傳遞給它的參數
$0:命令本身
$*:傳遞給腳本的所有參數,全部參數合為一個字符串
$@:傳遞給腳本的所有參數,每個參數為獨立的字符串
$#:傳遞給腳本的參數的個數
注釋:$@ $* 只在被雙引號包起來的時候才會有差異
set – – 清空所有位置變量
只讀變量:readonly name 不能修改變量
readonly -p 查看只讀變量
刪除變量:unset name
四、 ps -ef 查看進程號 ps -ef |grep bash 查看bash的進程號
$:顯示當前的PID
PPID:顯示父進程的PID
SHLVL: 顯示當前SHELL是幾級bash
pstree 顯示進程樹
-p 同時顯示進程的PID
五、轉譯
\完全轉譯
“” 部分轉譯 不轉譯 \ ` ! $
‘’ 完全轉譯
六、bash中的算數運算
+, -, *, /, %取模(取余), **(乘方)在bc當中乘方是^
實現算術運算:
(1)let var=算術表達式
let var++ 自加1 let var- – 自減1 let var+3 自加3
(2) var=$[算術表達式]
(3) var=$((算術表達式))
(4) var=$(expr arg1 arg2 arg3 …) 乘法時要轉譯* ,即\*
(5) declare –i var = 數值
(6) echo ‘算術表達式’ | bc
七、與,或,非 (true=1 false=2)
與:1與1=1
1與0=0
0與1=0
0與0=0
只要有一個假則為假
短路與 前一個為假,則不再判斷第二個值
或:1或1=1
1或0=1
0或1=1
0或0=0
只要有一個真則為真
短路或,前一個為真,則不再判斷第二個值
非:!1=0
!0=1
八、測試
測試命令
test expression
[ expression ]
[[ expression ]]
長格式的例子:
test “$A” == “$B” && echo “Strings are equal”
test “$A” -eq “$B” && echo “Integers are equal” ?
簡寫格式的例子:
[ “$A” == “$B” ] && echo “Strings are equal”
[ “$A” -eq “$B” ] && echo “Integers are equal
EXPRESSION1 -a EXPRESSION2 并且
EXPRESSION1 -o EXPRESSION2 或者
! EXPRESSION
必須使用測試命令進行
數值測試:
-gt 是否大于
-ge 是否大于等于
-eq 是否等于
-ne 是否不等于
-lt 是否小于
-le 是否小于等于
字符串測試:
= = 是否等于
> ascii碼是否大于ascii碼
< 是否小于
!= 是否不等于
=~ 左側字符串是否能夠被右側的pattern所匹配
以上的表達式一般用在[[ ]]中
-z 檢驗字符串是否為空,空為真,非空為假
-o 與-z相反
用于字符串比較時的用到的操作數都應該使用引號
文本權限測試:
-r FILE:是否存在且可讀
-w FILE: 是否存在且可寫
-x FILE: 是否存在且可執行
-u FILE:是否存在且擁有suid權限
-g FILE:是否存在且擁有sgid權限
-k FILE:是否存在且擁有sticky權限
雙目測試:
FILE1 -ef FILE2: FILE1與FILE2是否指向同一個設 備上的相同inode
FILE1 -nt FILE2: FILE1是否新于FILE2(mtime)
FILE1 -ot FILE2: FILE1是否舊于FILE
組合條件測試:
第一種方式:
COMMAND1 && COMMAND2 并且
COMMAND1 || COMMAND2 或者
! COMMAND 非
如:[[ -r FILE ]] && [[ -w FILE ]] ?
第二種方式:
EXPRESSION1 -a EXPRESSION2 并且
EXPRESSION1 -o EXPRESSION2 或者
! EXPRESSION
必須使用測試命令進行
針對以上的內容做出了以下練習
1、編寫腳本/root/bin/systeminfo.sh,顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小。
針對此題就是考察一些命令的使用:查看主機名:hostname 查看系統版本:cat /etc/redhat-release 查看內核版本:uname -r 查看CPU型號:cat /proc/cpuinfo 查看內存大小:cat /proc/meminfo查看硬盤大?。篺disk -l
2、編寫腳本/root/bin/sumid.sh,計算/etc/passwd文件中的第10個用戶和第20用戶的ID之和
這個只是針對第十個用戶和第二十個用戶。
這個針對多個用戶來說,只需要把grep后面的截取內容改了即可
3、編寫腳本/root/bin/hostping.sh,接受一個主機的IPv4地址做為參數,測試是否可連通。如果能ping通,則提示用戶“該IP地址可訪問”;如果不可ping通,則提示用戶“該IP地址不可訪問”
ping -c 是ping的結果顯示幾行,-W是幾秒ping一次 &> 是把錯誤或者正確的結果都導入黑洞里面不顯示結果
4、編寫腳本/root/bin/checkdisk.sh,檢查磁盤分區空間和inode使用率,如果超過80%,就發廣播警告空間將滿
此題就是先把磁盤分區空間和inode的最大使用率給找出來,然后判斷是否超過80%,然后用wall報警提醒用戶。
5、編寫腳本/root/bin/excute.sh ,判斷參數文件是否為sh后綴的普通文件,如果是,添加所有人可執行權限,否則提示用戶非腳本文件
此題就是先判斷是否是普通文件,然后以取基名的方法把目錄名字取出來,然后判斷是否以sh后綴的既可以。
腳本的功能就是(1)自動化常用命令(2)執行系統管理和故障排除(3)創建簡單的應用程序(4)處理文本和文件
腳本對于我們以后的工作非常方便,我們以后的工作大多數也都是寫腳本的。所以對于這一塊我們應該更加努力。
原創文章,作者:In summer,如若轉載,請注明出處:http://www.www58058.com/83791