本節索引
一、編程基礎
二、腳本基本格式
三、變量
四、條件測試
五、配置用戶環境
要想玩轉Linux系統,編寫shell腳本是必須要掌握的技能。那什么是shell編程呢?簡單來說,shell編程就是對多個Linux命令進行邏輯處理。
下面,我們從編程的基礎開始講起:
一、編程基礎
1.什么是程序?
程序是指:指令+數據
程序編程風格可分為:
過程式:以指令為中心,數據服務于指令(關注過程,小軟件開發)
對象式:以數據為中心,指令服務于數據(關注結果,適合開發大型軟件)
2.程序的執行方式
計算機:運行二進制命令
編程語言:
低級:匯編
高級:
編譯:高級語言–>編譯器–>目標代碼 (由程序員完成編譯器翻譯過程,安全性相對好)
java,C#
解釋:高級語言–>解釋器–>機器代碼 (由電腦完成解釋器翻譯過程,安全性不如編譯型)
shell,perl,python
shell程序:提供了編程能力,解釋執行
3.編程基本概念
編程邏輯處理方式:
順序執行
循環執行
選擇執行
shell編程:過程式、解釋執行
編程語言的基本結構:
各種系統命令的組合
數據存儲:變量、數組
表達式:a+b
語句:if
二、腳本基本格式
格式要求:
首行shebang機制(即聲明腳本使用哪種編程語言)
如:???????? #!/bin/bash
#!/bin/python
shell腳本的用途有:
自動化常用命令
執行系統管理和故障排除
創建簡單的應用程序
處理文本或文件
運行腳本:
1.給予執行權限,執行
2.直接運行解釋器,將腳本作為解釋器程序的參數運行
腳本規范:
腳本代碼開頭約定:
1.第一行一般為調用使用的語言
2.程序名,避免更改文件名為無法找到正確的文件
3.版本號
4.更改后的時間
5.作者相關信息
6.該程序的作用,及注意事項
7.最后是各版本的更新簡要說明
腳本示例:
#!/bin/bash
# ——————————————
# Filename:??? hello.sh # Revision:??? 1.1
# Date:??????? 2018/04/01
# Author:????? wangx
# Email:?????? wangx@gmail.com
# Website:???? www.donlihuoguo.cn
# Description: This is the first script
# ——————————————
# Copyright:?? 2018 wang
# License:???? GPL? echo “hello world”
腳本調試:
bash -n script? 檢查腳本的語法錯誤
bash -x script? 調試腳本執行
三、變量
定義變量時,變量名不加$符號,如:
my_name=”wangx”
*變量命名規則:
1.數字、字母、下劃線,不能以數字開頭
2.不能使用程序中的保留字:如if,for等
3.做到見名知意
注意:
引用變量一般需加$
賦值變量:
name=” ”?? 要加引號
存放多行字符時”$name”變量外加雙引號可保留換行格式
*bash變量的種類
局部變量、全局變量、本地變量、位置變量、特殊變量
局部變量:只在當前shell進程生效,對當前shell之外其他shell進程,包括父shell和子shell都無效
全局變量:生效范圍在當前shell進程及其子進程;父進程變量可以傳給子進程,子進程變量不可向上傳給父進程
數字變量:$10以上的變量需要加花括號${10}
特殊變量:$1,$@,$*,$#,$0等、
$1,$2,…:對應第1、第2參數,shift[n]換位置
$0:命令本身
$*:傳遞給腳本的所有參數,每個參數合為一個字符串
$@:傳遞給腳本的所有參數,每個參數為獨立字符串
$#:傳遞給腳本的參數的個數
$@$*只在被雙引號包起來的時候才會有差異
set–???????? 清空所有位置變量
注:怎么判斷變量前加不加$符號?
如果命令能識別變量就不加$,如果命令不能識別變量加$;
養成好習慣:編完腳本將變量用unset刪掉;
()中使用的命令為一次性的,小括號中相當于在子進程中執行命令
注:小括號中所說的子進程與常規的子進程不是一回事
例如:x=1;echo $$;(echo $$)中顯示進程號一致
{ ;}中使用命令時在當前shell環境中執行,不開啟子進程影響當前shell環境
*變量運算
bash中的算術運算:help let
+,-,*,/,%取余,**乘方
實現算術運算:
1.let var=算術表達式
2.var=$[算術表達式]
3.var=$((算術表達式))
注:算術運算過程中,空格盡量刪除
條件測試過程中,能加空格地方盡量加空格
正則條件測試時,正則表達式不加引號
四、條件測試
測試命令:
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]??? 雙括號一般用于左側字符匹配右側擴展正則表達式
注:EXPRESSION前后必須有空白字符
評估布爾聲明,以便用在條件性執行中:
若真,則返回0
若假,則返回1
例如:#a=1;b=2
#[ $a -eq $b ]
#echo $?
#1
#a=2;b=2
#[ $a -eq $b ]
#echo $?
#0
條件性的執行操作符
&&代表條件性的AND THEN,前面執行結果$?=0時,繼續執行&&后命令
||代表條件性的OR ELSE,前面執行結果$?不為0時,執行||后命令
test? 與[? ]效果相同,注意括號里內容兩邊需加空格
-v VAR????? 變量VAR是否設置
數值測試:
-gt??? 是否大于(greater-than)
-ge?? 是否大于等于(greater-than-or-equal)
-eq?? 是否等于(equal)
-ne?? 是否不等于(not-equal)
-lt???? 是否小于(less-than)
-le??? 是否小于等于(less-than-or-equal)
字符串測試:
==??? 是否等于
>?????? ascii碼是否大于ascii碼
<?????? 是否小于
!=???? 是否不等于
=~??? 左側字符串是否能夠被右側的PATTERN所匹配
注:使用PATTERN匹配時,需要加雙括號[[ ]];使用擴展的正則表達式,且正則表達式不能加引號
-z????? 字符串是否為空,空為真,不空為假
-n???? 字符串是否為不空,不空為真,空為假
注:用于字符串比較時的用到的操作應該都使用引號
字符串是否為空還可用[ “$name” == “” ]來測試。
文件相關測試:
存在性測試:
-a FILE???? 同-e
-e FILE 文件存在性測試,存在為真,否則為假
存在性及類別測試:
-b FILE 是否存在且為塊設備文件
-c FILE 是否存在且為字符設備文件
-d FILE 是否存在且為目錄文件
-f FILE 是否存在且為普通文件
-h FILE 同-L
-L FILE????? 是否存在且為符號鏈接文件
-p FILE 是否存在且為管道文件
-S FILE 是否存在且為套接字文件
文件權限測試:
-r FILE????? 是否存在且有可讀權限
-w FILE 是否存在且有可寫權限
-x FILE 是否存在且有可執行權限
文件特殊權限測試:
-u FILE 是否存在且擁有suid權限
-g FILE 是否存在且擁有sgid權限
-k FILE 是否存在且擁有sticky權限
文件大小測試:
-s FILE 是否存在且非空
文件是否打開:
-t fd:fd 文件描述符是否在終端已經打開
-N FILE 文件自從上一次被讀取之后是否被修改過
-O FILE 當前有效用戶是否為文件屬主
-G FILE 當前有效用戶是否文文件屬組
注意:文件測試后跟空字符時,也反饋為True,如果要保證一個文件存在且滿足測試條件時,
應表示為:例:[ -n “file” -a -d “file” ]
file文件是否存在且為目錄文件
雙目測試:
FILE1 -ef FILE2???????????????? FILE1是否是FILE2的硬鏈接
FILE1 -nt FILE2???????????????? FILE1是否新于FILE2(mtime)
FILE1 -ot FILE2???????????????? FILE1是否舊于FILE2
*Bash的組合測試條件:
第一種方式:
COMMAND1 && COMMAND2????? 并且
COMMAND1 || COMMAND2??????? 或者
!COMMAND???????? 非
第二種方式:
[ EXPRESSION -a EXPRESSION ]???? 并且
[ EXPRESSION -o EXPRESSION ]???? 或者
[ !EXPRESSION ]????????? 非
注:優先級為:”!”最高,”-a”次之,”-o”最低
短路與&&
0&&0=0
0&&1=0
1&&0=0
1&&1=1
cmd1 && cmd2
如果cmd1為假,cmd2不需要執行,反之cmd1為真,需要cmd2執行
短路或||
0||0=0
0||1=1
1||0=1
1||1=1
cmd1 || cmd2
如果cmd1為真,cmd2不需要執行,反之cmd1為假,需要cmd2執行
異或 XOR ^
如果相同為假,反則為真
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
0 ^ 0 = 0
注意:[? ]和test用變量時,最好加雙引號””避免出問題
false || { echo cmd1 ; echo cmd2 ; }
false || (echo cmd1 ; echo cmd2)
*使用read命令來接受輸入
read???????? 使用read來把輸入值分配給一個或多個shell變量
-p???? 指定要顯示的提示
-s ?? 靜默輸出,一般用于密碼
-n???? N指定輸入的字符長度N
-d???? ‘字符’輸入結束符,類型與輸入重定向的<<EOF
-t N? TIMEOUT為N秒,N秒內無輸入將自動退出
read命令從標準輸入中讀取單詞,并給每個單詞分配一個變量
例如:
read -p “Enter a filename:” FILE??? 標準輸入將賦予變量$FILE
read命令從標準輸入中讀取單詞,并給每個單詞分配一個變量
read 給多個變量賦值的方法:
(1)將多個變量輸入一個文件中,用空格分開,輸出重定向
read a b c < f
(2)用“>>>”分開:
read a b c <<< “x y z”
五、配置用戶環境
bash的配置文件
按生效范圍劃分,存在兩類:
全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
個人配置:
~/.profile
~/.bashrc
shell登錄的兩種方式:
交互式登錄:
1.直接輸入賬號密碼登錄
2.su – username 切換的用戶
執行順序:/etc/profile –> /etc/profile.d/*.sh –> ~/.bash_profile –> ~/.bashrc–> /etc/bashrc
非交互式的登錄:
1.su usernme
2.圖形界面打開的終端
3.執行腳本
4.任何其他的bash實例
執行順序:~/.bashrc –> /etc/bashrc –> /etc/profile.d/*.sh
注:只在交互式登錄生效:/etc/profile,~/.bash_profile
配置執行文件按功能劃分,存在兩類:
profile類和bashrc類
Profile類:為交互式登錄的shell提供配置
全局生效:/etc/profile ,/etc/profile.d/*.sh
個人生效:~/.bash_profile
功用:
(1)用于定義環境變量
(2)運行命令或腳本
Bashrc類:為非交互式和交互式登錄的shell提供配置
全局生效:/etc/bashrc
個人生效:~/.bashrc
功用:
(1)定義命令別名和函數
(2)定義本地變量
修改profile和bashrc文件后使生效的兩種方法:
(1)重新啟動shell進程
(2).或sourc;例:.~/.bashrc
注意: .或source執行腳本表示將在當前進程運行,而不是開啟一個子進程運行(配置文件一般用此方式執行)
bash執行腳本則是開啟一個進程執行(運行腳本一般用此方式執行)
Bash退出任務
保存在~./.bash_logout文件中(用戶)
在退出登錄shell時運行
可用于:
創建自動備份
清除臨時文件
清除操作歷史等
特殊的變量$-
#echo $-
#hibBH
h:hash緩存功能;set -h,關閉hash功能;set +h,開啟hash功能
i:代表交互式shell
m:打開監控模式
B:大括號擴展
H:history,命令操作歷史
bash展開命令的優先級:
把命令行分成單個命令詞
展開別名
展開大括號{}
展開波浪符~
命令替換$()和“
再次把命令行分成命令詞
展開文件通配(*、?等)
I/O重定向
運行命令
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/95644