編程基礎:
程序:指令+數據
程序編程風格;
面向過程:以指令為中心,數據服務于指令
面對對象:以數據為中心,指令服務于數據
高級:
編譯:高級語言—>編譯器—>目標代碼
Java、C#
解釋:高級語言—>解釋器—>機器代碼
shell、Perl、Python
編程邏輯處理方式:
順序執行
循環執行
選擇執行
shell編程:過程式、解釋執行
編程語言的基本結構:
各種系統命令的組合
數據存儲:變量、數組
表達式:a + b
語句:if
格式要求:首行shebang機制
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
大批量重復的程序可以寫成腳本
腳本格式
shebang要求必須寫
添加注釋
注釋用#開頭
運行腳本給執行權限
腳本命令沒有關聯時前面的命令報錯不影響后面的命令;如有關聯時反之。
bash -n [腳本] #測試腳本
bash -x [腳本] #調試執行
+表示執行的命令
++表示嵌套的執行命令
變量:命名空間的數據
變量定義命令時加反向單引號
調用變量時要加$
變量引用文件,顯示時加雙引號保留其格式
例如:fdtab=`cat /etc/fdtab`
echo “fdtab”
bash變量不分類型,直接賦值即可(都是字符,不支持浮點數)
關鍵字不能當變量
例如:if for ls hostname等
變量不能用數字或數字打頭
見名知意
統一命名規則:駝峰命名法
例如:HostName、hostName
bash變量的種類
局部變量:特定場合有效,當前進程有效,其子進程無效,其父進程也無效
pstree -p #查看進程樹附屬關系
環境(全局)變量:當前shell進程及其子進程有效,子進程可以更改賦值但不能父進程的賦值不更改
export #賦值全局變量
unset [變量] #刪除變量,不加$
set 顯示所有變量以及函數
printenv:同上
export:同上
declare -x:同上
declare -r:顯示“常量”
位置變量
定義10以上的變量加{}系統才能識別數字變量
$1,$2…..$n:對應第1、第2等參數($10)使用時用大括號擴起來${10}
$*:把所有參數合并成一個整體,用雙引號引起等同于$@
$0:如果是軟連接,顯示其軟鏈接的文件名
$@:每個參數為獨立字符
$#:傳遞給腳本的參數的個數
shift:移動輸入參數,默認移動一位(換位)
set–:刪除所有位置變量
特殊變量
$_:上一個命令的參數
$*:把所有參數合并成一個整體,用雙引號引起等同于$@
$0:如果是軟連接,顯示其軟鏈接的文件名
$@:每個參數為獨立字符
$#:傳遞給腳本的參數的個數
$$:當前進程的ID
$?變量保存最近命令退出狀態
shift:移動輸入參數,默認移動一位
set–:刪除所有位置變量
bash內建的環境變量:
$PATH
$SHELL
$USER
$UID
$HOME
$PWD
$SHLVL:shell嵌套深度
$LANG
$$:當前進程ID
$PPID:父進程ID
$HOSTNAME
$HISTSIZE
—:上一個命令的最后一個字符串
聲明只讀變量(常量):
readonly name:只能調用不能更改不能刪除,生命周期=當前進程的有效生命周期
declare -r name:
命令加小括號:相當于開啟了一個臨時的子進程但不是子進程,執行完命令后回到當前進程
例如:(cd /etc ; rm -rf ) #執行完回到當前目錄
聲明變量加小括號:臨時聲明執行,只執行一次后刪除
例如:(name=wang;echo $name)
小括號開啟子shell不影響當前shell
x=1;echo “pid=$$”;(echo “subpid=$$”;echo “subx=$x”;x=2;echo “subx2=$x”);echo x=$x
pid=2887
subpid=2887
subx=1
subx2=2
x=1
大括號開啟子shell影響當前shell
退出狀態
0表示成功,1-255表示失敗
語法錯誤$?不為零,命令錯誤$?由最后一條命令決定
腳本中exit可以定義$?返回的值
ping -c# [IP地址] #指定ping幾次
算術運算:
+,-,*,/,%取余,**乘方
let 變量=算術表達式
變量=$[算術表達式]
變量=$((算術表達式))
變量=$(expr arg1 arg2 arg3 …)
declare –i var = 數值 #把變量聲明成數值
echo ‘算術表達式’ | bc
賦值
增強型賦值:
+=, -=, *=, /=, %=
邏輯運算
&:與
0&0=0
0&1=0
1&0=0
1&1=1
0為false假
1為true真
|:或
0|0=0
0|1=1
1|0=1
1|1=1
^:異或
相同為假,不同為真
0^0=0
0^1=1
1^0=1
1^1=0
例如:
替換a和b的賦值
a=6
b=4
a=$[a^b];b=$[a^b];a=$[a^b];echo $a $b
&&:短路與,
例如:cmd1&&cmd2
命令一為假,命令二則不執行,命令一為真,執行命令二
||:短路或,
例如:cmd1||cmd2
命令一為真,命令二則不執行,命令一為假,執行命令二
?。悍?/p>
test #判斷變量
[ -n 變量 ] 判斷變量是否為非空0為非空1為空 相當于[ 變量 ]
[ -z 變量 ] 判斷變量是否為空1為非空0為空
[[]] 使用正則表達式時使用
數值測試
-v 變量 :查看變量是否賦值
數值測試:
-gt ?是否大于
-ge ?是否大于等于
-eq ?是否等于
-ne ?是否不等于
-lt ?是否小于
-le ?是否小于等于
字符串測試:
== ?是否等于
> ?ascii碼是否大于ascii碼
< ?是否小于
!= ?是否不等于
=~ ?左側字符串是否能夠被右側的擴展正則所匹配,需要配合[[]]使用
bash的文件測試
bash [腳本]:開啟一個子進程相當于(./腳本)
read :把標準輸入賦值給一個或者多個變量用空格分隔開
-p:指定要顯示的提示
-s:靜默輸入
read x y z <<< “i j k”:批量賦值
.和source以及bash執行的區別
bash [腳本]和./[腳本]執行結果相同,在腳本的子進程中運行
source [腳本]和. [腳本]:在當前shell運行
腳本中不支持命令別名;也不支持定義別名
變量$-
h:開啟hash緩存表功能
i:表示當前shell是交互式shell
m:打開監控模式
B:大括號擴展
H:打開history的H選項
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/95703