shell腳本編程
程序:指令+數據
程序編輯風格:
過程式:以指令為中心,數據服務于指令
對象式:以數據為中心,指令服務于數據
shell程序:提供了編程能力,解釋執行
計算機:運行二進制指令
編程語言:
低級:匯編語言
高級:編譯:高級語言–>編譯器–>目標代碼
java,c#,c,c++
解釋:高級語言–>解釋器–>機器代碼
shell,per,python
編程邏輯處理方式:
順序執行
循環執行
選擇執行
shell編程:
過程式,解釋執行
編程語言的基本結構
數據存儲,變量,數組
表達式:a+b
語句:if
shell腳本包含一些命令或聲明,并符合一定格式文本文件。
首行shebang機制
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
shell腳本用途有:
自動化常用命令
執行系統管理和故障排除
創建簡單的應用程序
處理文本或文件
腳本 hello word 例子
#!/bin/bash
#autho:zczx
#Version:1.0
#Description:hello word
echo "hello,word"
:wq
chmod u+x hello.sh
/root/hello.sh
不建議在根目錄PATH加入.
.bash_profile
bash -n f1 檢查語法是不是完整
bash -x f1 調試,一條一條執行,發現出錯會報錯可以檢查命令執行順序
變量
變量的內容可以是更改的,內容可以存字符,存數值。不同的變量應用的范圍不同,數據存儲格式不同,參與的運算不同。
類型:字符
數值:整形,浮點型
盡量不要使用與系統指令相同的名字作為變量法則名字
1 不能使程序中的保留字
2 只能使用數字,字母及下劃線,且不能用數字開頭
3 駝峰法則,字母首個字母開頭大寫
4 見名知義
大寫
PATH
USER
PWD
OLDPWD
HISTSIZE
HISTFIlESIZE
HISTFILESIZE
SHELL
HOME
PS1
HISTTIMEFORMAT
UID
HISTFILE
bash
根據變量的生效范圍等標準:
本地變量:生效范圍為當前shell進程;對當前shell之外的其它shell進程,包括當前shell的子shell進程均無效
本地變量不能給子進程使用
zczx1=xxx 不能帶空格
zczx1="xxx aaa bbb" 多個用'' ""來引入
echo $zczx1
echo "$zczx1" 強引用,如果變量所引用的指令跟原本指令顯示的一樣輸出。
unset zczx1 刪除變量,釋放變量。
環境變量:生效范圍為當前shell進程及其子進程
export +變量 聲明為環境變量
declare -x 聲明為環境變量
declare -r 只讀常量,不能修改,刪除。只能退出腳本
readonly name 只讀常量
a=xxx
b=yyy
echo ${a}b
xxxb a是變量,b不是
局部變量:生效范圍為當前shell進程中某代碼片斷(通常指函數)
都只針對當前終端使用
位置變量:$1, $2, …來表示,用于讓腳本在腳本代碼中調用通過命令行傳遞給它的參數
特殊變量:$?, $0, $*, $@, $#
$1, $2, …:對應第1、第2等參數,shift [n]換位置
$0: 命令本身
$*: 傳遞給腳本的所有參數,全部參數合為一個字符串
$@: 傳遞給腳本的所有參數,每個參數為獨立字符串
$#: 傳遞給腳本的參數的個數
$@ $* 只在被雙引號包起來的時候才會有差異
$*引用的參數都作為一個獨立的整體 "a b c"
$@引用的參數每個數都能分為獨立的字符 a b c
bash中的算術運算
+,-,*,/,%取模(取余),**(乘方)
實現算術運算:
(1)let var =算術表達式
let $var*=5
let $var=5 * var
(2) var=$[算術表達式]
(3) var=[算術表達式]
(4) var=$(expr arg1 arg2 arg3 …)
(5) declare –i var= 數值
(6) echo ‘算術表達式’ | bc
treu | false
1 0
與:有0就為0.1與1為1.
或:有1就為1.0與0為0.
!1=0
!0=1
短路與 &&:第一個條件成立,就執行第二個條件。第一個條件不成立,將不執行。
短路或 ||:第一個條件成立,就不執行第二個條件,第一個條件不成立,才執行第二個條件。
異或:^
相同為假,不同為真。
聚集命令
有兩種聚集命令的方法:
復合式:date; who | wc -l
命令會一個接一個地運行
子shell:(date; who | wc -l ) >>/tmp/trace
進程使用退出狀態來報告成功或失敗
0 代表成功,1-255代表失敗
$? 變量保存最近的命令退出狀態
echo $? 查詢命令是否成功執行
ping -c1 -w1 10.0.1.0 &> /dev/null
一次 一秒
當使用了(),里面所執行的內容等于新建了一個子shell運行。
條件性
判斷某需求是否滿足,需要由測試機制來實現;
專用的測試表達式需要由測試命令輔助完成測試過程;
?以便用在條件性執行中
若真,則返回0
若假,則返回1
test
a=haha
b=haha
test $a = $b [$a -eq $b ] -eq是判斷數字的對比
[ $a = $b ] 字符的對比
[[ $a = $b ]]
[[$1]]可以查詢變量里面是否有定義
bash的測試類型
數值測試:
-gt:是否大于:
-ge:是否大于等于:
-eq:是否等于:
-ne:是否不等于
-lt:是否小于:
-le:是否小于等于:
==:是否等于:
>:Ascill碼是否大于Ascill碼
<:Ascill碼是否小于Ascill碼
!=:是否不等于
=~:左側字符串是否能夠被右側的字符串所匹配,要用[[]]
-z:字符串是否為空,空為真,不空為假。[[]]
-n:字符串是否不空,不空為真,空為假。[[]]
[[-n $a]] 看是不是非0
[[-z $a]] 看是不是為0
文件測試
[-a /etc/] 查看是否存在
存在性測試
-a FILE:同-e
-e FILE: 文件存在性測試,存在為真,否則為假;
?存在性及類別測試
-b FILE:是否存在且為塊設備文件;
-c FILE:是否存在且為字符設備文件;
-d FILE:是否存在且為目錄文件;
-f FILE:是否存在且為普通文件;
-h FILE 或-L FILE:存在且為符號鏈接文件;
-p FILE:是否存在且為命名管道文件;
-S FILE:是否存在且為套接字文件;
文件權限測試:
-r FILE:是否存在且可讀
-w FILE: 是否存在且可寫
-x FILE: 是否存在且可執行
? 文件特殊權限測試:
-g FILE:是否存在且擁有sgid權限;
-u FILE:是否存在且擁有suid權限;
-k FILE:是否存在且擁有sticky權限;
文件大小測試:
-s FILE: 是否存在且非空;
-o 或者
[[ -r /tmp/file1 ]] -a [[ -w /tmp/file1]] && echo '用戶對文件可讀' || echo '用戶對文件不可讀'
編寫腳本/root/bin/systeminfo.sh,顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小。
編寫腳本/root/bin/backup.sh,可實現每日將/etc/目錄備份到/root/etcYYYY-mm-dd中
編寫腳本/root/bin/disk.sh,顯示當前硬盤分區中空間利用率最大的值
編寫腳本/root/bin/links.sh,顯示正連接本主機的每個遠程主機的IPv4地址和連接數,并按連接數從大到小排序
寫一個腳本/root/bin/sumid.sh,計算/etc/passwd文件中的第10個用戶和第20用戶的ID之和
寫一個腳本/root/bin/sumspace.sh,傳遞兩個文件路徑作為參數給腳本,計算這兩個文件中所有空白行之和
寫一個腳本/root/bin/sumfile.sh,統計/etc, /var, /usr目錄中共有多少個一級子目錄和文件
寫一個腳本/root/bin/argsnum.sh,接受一個文件路徑作為參數;如果參數個數小于1,則提示用戶“至少應該給一個參數”,并立即退出;如果參數個數不小于1,則顯示第一個參數所指向的文件中的空白行數
寫一個腳本/root/bin/hostping.sh,接受一個主機的IPv4地址做為參數,測試是否可連通。如果能ping通,則提示用戶“該IP地址可訪問”;如果不可ping通,則提示用戶“該IP地址不可訪問”
chmod -rw /tmp/file1,編寫腳本/root/bin/per.sh,判斷當前用戶對/tmp/fiile1文件是否不可讀且不可寫
編寫腳本/root/bin/nologin.sh和login.sh,實現禁止和充許普通用戶登錄系統。
寫一個腳本/root/bin/hostping.sh,接受一個主機的IPv4地址做為參數,先判斷是否合格IP,否,提示IP格式不合法并退出,是,測試是否可連通。如果能ping通,則提示用戶“該IP地址可訪問”;如果不可ping通,則提示用戶“該IP地址不可訪問”
計算1+2+3+…+100的值
計算從腳本第一參數A開始,到第二個參數B的所有數字的總和,判斷B是否大于A,否提示錯誤并退出,是則計算之
原創文章,作者:swzczx,如若轉載,請注明出處:http://www.www58058.com/35338