編程基礎
程序:指令+數據
程序編程風格:過程式:以指令為中心,數據服務于指令
對象式:以數據為中心,指令服務與數據
shell程序:提供了編程能力,解釋執行
程序的執行方式:
計算機:運行二進制指令
高級語言 :?? 編譯:?? 高級語言??????????? 編譯器?????????? 目標代碼(Java,c#)
解釋:?? 高級語言?????????? 解釋器????????? 機器代碼(shell,Perl,Python)
編程基本概念
編程邏輯處理方式:順序執行、循環執行、選擇執行
Shell編程:過程式、解釋執行
編程語言的基本結構:
各種系統命令的組合
數據存儲:變量、數組
表達式:a?? +?? b
語句:if
Shell腳本基礎
Shell腳本:包含一些命令或聲明,并符合一定格式的文本文件
格式要求:首行shebang機制
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
Shell腳本的用途:自動化常用命令;執行系統管理和故障排除;創建簡單的應用程序;處理文本或文件
創建shell腳本:1.用文本編輯器來創建文本文件(第一行必須包括shell聲明序列;添加注釋)??? 2.運行腳本(給予權限;直接運行解釋器)
腳本規范
腳本代碼開頭約定
1、第一行一般為調用使用的語言
2、程序名,避免更改文件名為無法找到正確的文件
3、版本號
4、更改后的時間
5、作者相關信息
6、該程序的作用,及注意事項
7、最后是各版本的更新簡要說明
腳本調試:
bash?? -n?? 腳本名?????? //檢測腳本中的語法錯誤:語法錯誤,后續命令不執行;不是語法錯誤,后續命令繼續執行
-x??? 腳本名????? //調試執行?? 可查看腳本的執行過程
++??? 代表嵌套深度
變量:(強類型、弱類型)
如果命令可以識別變量,就可以不加$符號
$變量? //引用變量?? 若變量超過十個,需要用{}引起來
echo? “$變量”?? //變量若賦值一個文件的內容,輸出時加引號可保留原格式
變量作用:
- 數據存儲格式
- 參與的運算
- 表示的數據范圍
變量的命名法則:
- 不能使用程序中的保留字
- 只能使用數字、字母、下劃線,且不能以數字開頭
- 見名知義(最好用英文單詞)
- 統一命名規則:駝峰命名法
=?? //給變量賦值
變量種類:局部變量:【只對當前的進程有效,不能傳給子進程;只在當前會話有效】、環境(全局)變量:在【父進程定義的變量,子進程可繼承】、本地變量、位置變量、特殊變量
pstree?? -p?? //顯示所有進程關系
echo? $$?? //顯示當前進程編號
echo?? $PPID?? //查看父進程編號
export?? 變量??? //定義環境變量(declare? -x?? 變量)
set??? //可以查看到全部的變量,還有函數信息
unset? 變量??? //取消給變量的賦值(變量前未加$)
$SHLVL???? //查看shell的嵌套次數
echo?? 后跟的認為是字符串,直接寫$CMD認為是命令
?
?$_?? ?????//上一個命令的最后一個參數
顯示所有的環境變量:env?????? ;???? printenv????? ;export???? ;??? declare? -x
聲明只讀變量:readonly?? name??? 或者? declare?? -r?? name
查看只讀變量:? readonly?? -r? name???????? declare –r?? //查看所有常量(readonly -p)
( name=haha; touch? /data/$name.log )?? //小括號用于臨時引用變量,開啟子shell,不影響當前shell環境(該子shell,不同于之前子進程)
{? name=haha; echo $name;? }?? //大括號影響當前shell環境,不開啟子shell
位置變量:
$數字?? //代表第幾個位置變量
$0????? //代表命令本身的整個路徑(若是軟鏈接可用$0實現不同的功能)
$*????? //代表傳遞給腳本的所有參數,全部參數合為一個字符串
$@???? //代表傳遞給腳本的所有參數,全部參數為獨立的字符串
$#??? //傳遞給腳本的參數個數
set?? —??? //清空所有位置變量
shift?? ??數字 //每執行一次將所有的位置參數向左移幾位(默認1位)
退出狀態:
$??? //可用來查看上條命令的執行結果,0代表成功,其他代表失敗
$?對于腳本來講:腳本的返回結果正確與否,是由最后一條命令決定的
bash 的自定義退出碼:? exit?? [數字]
算數運算:+?? –?? *??? /???? %(取余)?????? **(乘方)
RANDOM?????? //隨機數生成器
*//特定情況下需要轉義
實現算數運算:let? sum=i+j;? $[i+j];?? $((i+j));?? expr?? i? +? j? ;
declare ??-i? n=10?? //將變量n聲成整數???? ;?? echo?? 1+3? |bc
a=$((a^b));b=$((a^b));a=$((a^b));echo $a $b?? //實現a,b的值互換
邏輯運算(&與????????? |或???????? !非)
0?? false???????????????????? 1?? true
cmd1? ?短路與(&&)?? cmd2
如果cmd1為假,將不執行cmd2
如果cmd1為真,將執行cmd2
cmd1?? 短路或 (||)? cmd2
如果cmd1為假,將執行cmd2
如果cmd1為真,將不執行cmd2
異或XOR(^):相同為假,不同為真? (通過異或的中間值可實現兩個數值的轉換)
德摩根定律:
(非A)與(非B)=非(A或B)
(非A )或 (非B ) =非(A與B)
[[ $filename =~ .+\.sh$ ]] && echo sh || echo no sh??? //判斷文件的后綴是否為.sh
條件測試:判斷某需求是否滿足
測試命令:test? EXPRESSION
[? EXPRESSION? ]???? 變量在中括號使用時,用雙引號引起來
[[ EXPRESSION? ]]???? //支持擴展的正則表達式? (=~? 代表左側字符串是否匹配右側的正則;==右側支持通配符)
表達式1?? -a?? 表達式2????? //與關系,都真結果才為真
表達式1?? -o?? 表達式2????? //或關系,都假結果才為假
-z???? //判斷字符串是否為空,為真代表空
-n??? //判斷字符串是否為空,為真代表非空(-n可以省略不寫)
[??? x”$var”?? =? “ x”? ]????????? //也可用來判斷字符串是否為空
-v????? //判斷變量是否被設置
-a 或-e?? //判斷文件是否存在
數值測試:
gt??? 大于???????????????? ge??? 大于等于????????????????????????? eq?? 等于(比較數字)
lt??? 小于?????????????????? le???? 小于等于???????????????????????? ne?? 不等于
字符串測試:
=~??????? (代表左側字符串是否匹配右側的正則)
read??? ?//實現對變量的賦值,可賦值多個變量(建議一次賦一個值)
-p??? //指定提示內容
-s??? //靜默輸入
-n?? //指定輸入的字符長度
-d?? //可指定結束符
-t?? //設置超時時間
read?? x y z?? <<<”I?? j?? k? ”?? //實現批量賦值將ijk? 分別賦給變量xyz
Bash如何展開命令行:
- 把命令行分成單個命令詞
- 展開別名
- 展開大括號的聲明( {} )
- 展開波浪符聲明( ~?? )
- 命令替換$() 和?? ` `??? )
- 再次把命令行分成命令詞
- 展開文件通配( *??? ??? [abc] 等等)
- 準備I/O重導向( <???? >)
- 運行命令
Profile 類:
按功能劃分:profile類和bashrc類
Profile 類:為交互式登錄的shell提供配置
功用:用于定義環境變量、運行命令或腳本
Bashrc類:為非交互式和交互式登錄的shell提供配置
功用:定義命令別名和參數、定義本地變量
$- 變量 (默認功能組合himBH)
h? //代表hash?????????? set?? +h???? //禁用hash????????????? set?? -h???????? //啟用hash
i??? //代表當前環境是不是交互式環境
m?? //代表打開監控模式
B?? //代表大括號擴展
H? //代表可以展開歷史列表中的命令?????? !!代表返回最近的一個歷史命令
.???? source???? bash????? 直接運行腳本 之間的區別:
bash? 或者 直接運行腳本?? //兩者等價,都開啟子進程
source?????? //表示在當前shell中運行腳本,影響當前的工作環境
source?? 或?? .??? //一般用來運行配置文件
腳本中不識別別名,可以使用內部命令、外部命令
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/95744