shell腳本編程初步
程序:由數據和指令組成, 指令:由程序文件提供 數據:可以通過IO設備、文件、管道來得到,
程序:算法+數據結構 變量:變量名+變量名指向的內存空間 變量賦值: name = value變量類型:存儲格式:字符 數值(精確數值 近似數值) 表示數據范圍 參與的的運算 編程語言: 強類型變量編程語言:c 弱類型變量編程語言: bash把所有變量統統視作字符型。不支持浮點數據,除非借助第三方工具 bash中的變量無需事先聲明 聲明: 類型 變量名 變量替換:把變量名的出現位置替換為其所指向的內存空間中的數據 變量引用:$(var_name) $var_name 變量名:變量名只能包含數字、字母、下劃線,而且不能以數字開頭 變量名:見名知意,命名機制遵循某種法則,不能使用程序的保留字。例如:if else then while ...
變量類型:
本地變量:作用域僅為當前shell進程 環境變量:作用域為當前shell進程及其子進程 局部變量:作用域僅為某代碼片段(函數上下文) 位置參數變量:當執行腳本的shell進程傳遞的參數 特殊變量:shell內置的有特殊功能的變量 $? 0:成功 1-255:失敗 本地變量: 變量賦值:name = value 變量引用:$(name) $name “”:變量名會替換為其值 ‘’:變量名不會替換為其值 查看變量:set撤銷變量:unset name 注意:此處非變量引用,不要加$符號 環境變量: 變量賦值: (1)export name =value (2)name = value export name (3)declare -x name=value (4)name = vlaue declare -x name 變量引用:$(name),$name 注意:bash內嵌了許多環境變量(通常為全大寫字符),用來定義bash的工作環境 PATH HISTFILE HISTFILESIZE SHELL 。。 查看環境變量:export, declare -x, printenv,env 撤銷環境變量:unset name只讀變量: (1)declare -r name (2)readonly name 只讀變量無法重新賦值,并且不支持撤銷; 存活時間為當前shell進程的生命周期,隨shell進程終止而終止。
邏輯運算:
運算數:只有真(true,1)或假(false,0) 與: 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 異或:相同為假不同為真 短路法則: ~] COMMAND1 && COMMAN D2 COMMAND1:為假,則COMMAND2不會再執行: 否則,COMMAND1為真,COMMAND2必須執行 ~] COMMAND1 || COMMAND2 COMMAND1 為真,COMMAND2不會在執行 COMMAND1 為假,COMMAND2必須執行 實例:~] id $username || useradd $username 如果$username存在 則useradd $username不執行 如果$username不存在,則執行useradd $username,創建$username 用戶
shell腳本編程:
編程語言的分類:根據運行之前是否需要編譯(運行方式) 編譯運行:源代碼-->編譯器(編譯)-->程序文件 解釋運行:源代碼-->運行時啟動解釋器,由解釋器邊解釋邊運行; (源代碼本身不可執行,而是解釋器處理運行) 根據其編程過程當中,功能的實現,是調用庫還是調用外部的程序文件可分為: shell腳本編程: 利用系統上的命令及編程組件進行編程 完整編程: 利用庫或編程組件進行編程 根據編程模型分類: 面向過程式編程語言 面向對象式編程語言 程序 = 指令 + 數據 過程式:以指令為中心來組織代碼,數據是服務于代碼 順序執行 選擇執行 循環執行 代表:C語言 bash 對象式:以數據為中心來組織代碼,圍繞數據來組織指令 執行過程中先生成指定的對象 編寫程序的過程中要編寫很多的類(class) 類:實例化對象 代表:java ,c++, Python SHELL腳本編程:過程式編程,解釋運行,依賴于外部執行文件運行 如何寫shell腳本: 腳本文件的第一行,固定格式: 頂格寫:給出shebang,解釋器路徑,用于解釋執行當前的腳本的解釋器程序文件。 常見的解釋器: #!/bin/bash #!/usr/bin/python #!/usr/bin/pertshell腳本是什么? 可以認為是命令的堆積: 但是大多命令不具有冪等性,需要用程序邏輯來判斷運行條件是否滿足,以避免其運行中發生錯誤; 運行腳本: (1):賦予執行權限,并直接運行此腳本程序文件 chmod + x file (2):直接運行解釋器,將腳本以命令行參數傳遞給解釋器程序。 注意: 腳本中的空白行會被解釋器自動忽略 腳本中,除了shebang,余下的所有以#開頭的行 ,都會被視作注釋行而被忽略; shell腳本的運行是通過一個子shell進程實現的 bash的配置文件: 兩類 profile類:為交互式登錄的shell進程提供配置 bashrc類:為非交互式登錄的shell進程提供配置 登錄類型: 交互式登錄shell進程: 直接通過某終端輸入賬號和密碼后登錄打開的SHELL進程。 使用su命令:su - USERNAME,或者使用su -l USERNAME執行的登錄切換 非交互式登錄shell進程: su USERNAME執行的登錄和切換 圖形界面下打開的終端 運行腳本 profile類: 全局生效:對所有用戶都生效 /etc/profile /etc/profile.d/*.sh 用戶個人:僅對當前用戶有效 ~/.bash_profile 功用: 1、用于定義環境變量 2、運行命令或腳本 bashrc類: 對全局生效: /etc/bahsrc 用戶個人: ~/.bashrc 功用: 1、定義本地變量 2、定義命令別名 注意:只有管理員可修改全局配置文件; 配置文件的讀取順序: 交互式登錄shell進程: /etc/profile-->/etc/profile.d/*-->~/.bash_profile-->~/.bashrc-->/etc/bashrc 非交互式登錄的shell進程: ~/.bashrc-->/etc/bashrc-->/etc/profile.d/* 命令行中定義的特性,其作用域為當前shell進程的聲明周期 配置文件定義的特性,只對隨后重新啟動的SHELL進程有效 讓通過配置文件定義的特性立即生效: (1)通過命令行重復定義一次 (2)讓shell進程重新讀取配置文件 ~]# source /PATH/FROM/CONF_FILE ~]# ./PATH/FROM/CONF_FILE shell腳本之算術運算 加:+ 減:- 乘:* 除:/ 次方:** 取余運算:% 算數運算格式: (1)let VAR = 算數運算表達式 [root@localhost ~]# let sum=5+9 [root@localhost ~]# echo $sum 14 (2)VAR=$[算數運算表達式] [root@localhost ~]# echo $[5+9] 14 (3)VAR=$((算數運算表達式)) [root@localhost ~]# echo $((5+9)) 14 (4)VAR=$(expr $num1 + $num2) [root@localhost ~]# expr 5 + 9 14 要是想引用計算的結果要使用變量引用; [root@localhost ~]# sum=$(expr 5 + 9) [root@localhost ~]# echo $sum 14 注意乘法符號*在有些場景中需要使用轉義字符; 腳本文件格式: 第一行,頂格:#!/bin/bash 注釋信息:# 代碼注釋:寫腳本一定要寫代碼注釋,方便自己,利于他人看懂。 規范寫代碼: 縮進 適度添加空白行 編程思想: 問題空間--》解空間 變量: 局部變量:只在當前shell進程中的一段代碼片段中有效 本地變量:只在當前shell進程中有效,對其他shell進程包括當前shell的子進程均無效 環境變量:生效范圍為當前shell進程以及其子進程 只讀變量 位置參數變量:用于讓腳本在腳本代碼中調用通過命令傳遞給它的參數。 特殊變量:$?,$0,$*,$@,$# 數據類型: 字符型,數值型(精確數值,近似數值) (shell腳本內置不支持浮點數運算,需要借助其他工具) 增強型賦值: 變量做某種算術運算后結果回存至此變量中 let $i + # = let i+=# += -= *= /= %= 自增:++ let VAR =$[$VAR+1] let VAR+=1 let VAR++ 自減:-- let VAR =$[$VAR-1] let VAR-=1 let VAR-- 子shell進程:在當前腳本中用用括號將一段命令括起來說明此中的代碼將在當前腳本進程的子進程中運行。 例如: echo "$1"|grep -E '\<((([0-9]|[1-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|2[0-4][0-9]|25[0-5]))\>' && (ping -c1 -w1\$1 &> /dev/null && echo "您所給的IP是:$1-->該IP可訪問"||echo "您所給的IP是:$1-->該IP不可訪問")|| echo "您所給的IP格式不合法";exit 上面的代碼中:(ping -c1 -w1\$1 &> /dev/null && echo "您所給的IP是:$1-->該IP可訪問"\||echo "您所給的IP是:$1-->該IP不可訪問") 就是在其shell進程中的子shell進程中運行。
條件測試
判斷某需求是否滿足,需要由測試機制來實現; 專用的測試表達式需要由測試命令輔助完成測試過程; 評估布爾聲明,以便用在條件性執行中 若真,則返回0 若假,則返回1測試命令: test EXPRESSION [ EXPRESSION ] [[ EXPRESSION ]] 注意:EXPRESSION前后必須有空白字符
bash的測試類型
數值測試: -gt: 是否大于; -ge: 是否大于等于; -eq: 是否等于; -ne: 是否不等于; -lt: 是否小于; -le: 是否小于等于; 字符串測試: == :是否等于; >: ascii 碼是否大于ascii碼 碼 <: 是否小于 !=: 是否不等于 =~: 左側字符串是否能夠被右側的PATTERN所匹配 注意: 此表達式一般用于[[ ]] 中; -z "STRING" :字符串是否為空,空為真,不空為假 -n "STRING" :字符串是否不空,不空為真,空為假 注意:用于字符串比較時的用到的操作數都應該使用引號 文件測試: 存在性測試 -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 :是否存在且非空 文件是否打開: -t fd: fd 表示文件描述符是否已經打開且與某終端相關 -N FILE :文件自動上一次被讀取之后是否被修改過 -O FILE :當前有效用戶是否為文件屬主 -G FILE :當前有效用戶是否為文件屬組組合測試條件: COMMAND1 && COMMAND2 并且 COMMAND1 || COMMAND2 或者 !COMMAND 非 如: [ -e FILE ] && [ -r FILE ] EXPRESSION -a EXPRESSION 并且 EXPRESSION -o EXPRESSION 或者 !EXPRESSION 必須使用測試命令進行: # [ -z “$HOSTNAME” -o $HOSTNAME "==\ "localhost.localdomain" ] && hostname www.magedu.com # [ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab
原創文章,作者:dxkboke,如若轉載,請注明出處:http://www.www58058.com/34257
整體思路清晰,分類明確,層次感強,變量=左右不允許有空格,