程式設計語言和shell程式設計基礎
bash的特性之多指令執行的邏輯關系:
1.指令替換
command1 $(command2)
2.管道
command1 | command2 |command3.....
3.順序執行結構
command1 ;command2; command3....
4.選擇執行結構:
如果...那麼...
要麼...要麼...
邏輯運算:
(1) 與:邏輯乘法,1為真,0為假,&&
1 && 1 = 1
1 && 0 = 0
0 && 1 = 0
0 && 0 = 0
COMMAND1 && COMMAND2
表示:如果COMMAND1能夠成功執行,那麼将會執行COMMAND2;
如果COMMAND1能夠執行失敗,那麼COMMAND2不會執行;
例: 如果qhdlink使用者存在,就輸出資訊"hello qhdlilnk "
[root@localhost ~]# id qhdlink && echo "hello qhdlink"
uid=1001(qhdlink) gid=1006(qhdlink) 組=1006(qhdlink),1004(centos),1005(varnish)
hello qhdlink
與運算的短路運算法則:隻要第一個操作數為FALSE,則其邏輯運算結果為FALSE
(2)或: 邏輯加法,||雙目操作符
1 || 1 =1
1 || 0 =1
0 || 1 =1
0 || 0 =0
COMMAND1 || COMMAND2
表示:隻有COMMAND1執行失敗,COMMAND2才會執行;
如果COMMAND1執行成功,COMMAND2不會執行;
例:如果qhdlink使用者存在不輸出資訊,否則輸出資訊“create user qhdlink”
[root@localhost ~]# id qhdlink || echo "create user qhdlink"
id: qhdlink: no such user
create user qhdlink
[root@localhost ~]# id qhdlink || echo "create user qhdlink"
uid=8099(qhdlink) gid=8099(qhdlink) 組=8099(qhdlink)
或運算邏輯運算法則:隻要一個操作數為TURE,則其執行結果為TURE。
(3)非:邏輯取反,1為真,0為假,!,單目操作符
!1 = 0
!0 = 1
指令的狀态傳回值:
SUCCESS: 0
FAILURE: 1-255--FALSE
!COMMAND1 && COMMAND2 相當于 COMMAND1 || COMMAND2
!COMMAND1 || COMMAND2 相當于 COMMAND1 && COMMAND2
德.摩根定律
!(A&&B)= (!A || !B)
! (A||B) = !A && !B
三種邏輯運算的優先級
!>&&>||
bash腳本程式設計:
什麼叫程式設計?
使用人類自然語言或機器語言進行程式原代碼書寫的過程。
為什麼要程式設計?
為了能夠讓使用者在使用計算機的時候,可以讓計算機以非互動的方式完成某些任務,此時,使用者需 要将此類任務編輯成一個檔案,并讓計算機按照特定順序進行任務讀取,進而實作預期的功能。
為了讓計算機能夠解讀此類檔案的内容并正确的執行,必須将程式源代碼檔案轉換為計算機可以直 接識别并使用的二進制格式,該過程為編譯,想要完成編譯過程,必須使用特定的編譯器工具。因 此,無論使用何種程式設計語言進行程式編寫,都必須嚴格按照編譯器所能夠識别的特定格式和文法結 構進行程式編寫。
程式設計語言:
一.進階語言:
1. 根據源代碼的處理方式分類:
編譯型語言:
源代碼-->編譯器(編譯)-->[連結器(連結)-->]彙編器(彙編)-->可以執行的二進制 代碼檔案;
解釋型語言
源代碼-->解釋器(逐行解釋)-->邊解釋邊執行;
2. 根據程式設計過程中的功能實作是調用庫還是調用外部程式檔案分類:
完整程式設計語言:
利用庫或程式設計元件進行程式設計;
腳本程式設計語言:
利用解釋器調用被選擇的外部應用程式;
3.根據程式編寫規範分類:
過程式語言:
程式=指令+資料
以指令為中心,圍繞指令的功能實作設計資料和資料結構,資料為指令服務;
算法和指令的實作形式:
順序執行
選擇執行
循環執行
面向對象語言:
程式=算法+資料結構
以資料和資料結構為中心,将資料執行個體化,圍繞資料的需求來部署算法;
類(Class):被執行個體化的資料
屬性(Attribution):同一類中的不同對象的區分依據;
方法(Method):類的正确的操作方法;
二.低級語言:
機器語言:二進制語言
shell腳本程式設計-bash腳本程式設計;
過程式程式設計語言:解釋運作的程式設計語言,腳本類别(依靠外部應用程式檔案運作)
shell腳本到底是什麼?
1.純文字文檔--檔案中所有存儲或包含的指令+資料都是以字元為機關進行存儲的;
2.根據使用者的需求來解決使用者問題的簡單或複雜的指令組合體;
3.是一種具有“執行幂等性”的程式實體;
執行幂等性:任何指令的一次執行結果和多次執行結果是一緻的;
注意:
很多指令都不具備程式幂等性,是以在shell腳本中需要使用大量的程式邏輯來判斷某個指令 是否符合其運作條件進而避免在運作過程中出現的嚴重錯誤;
shell腳本中的代碼内容如何書寫?
1.首行必須是shebang,即解釋器程式的絕對路徑,必須占據絕對行首且必須單獨占據一行;
在執行腳本時,會根據shebang的訓示,啟動相應的解釋器以解釋腳本諸多的指令:
#!/bin/bash
#!/bin/sh
#!/usr/bin/python
#!/usr/bin/perl
...
例:統計/etc/grub2.cfg中的空白行行數
[root@localhost ~]# vim 1
#! /bin/bash
grep ^""$ /etc/grub2.cfg | wc -l
[root@localhost ~]# . 1
17
2.在shell腳本中,除了shebang之外,所有行首為#字元的行,均被解釋為注釋行;即:解釋 器隻會解釋其内容,但不執行;
3.解釋器會忽略腳本檔案中所有的空白行;空白行指的是:在一行文本中,除了空白字元,空 格字元,制表字元之外不具備其他任何類型字元的行;
4.大量的指令和關鍵字
指令:内部或外部應用程式
關鍵字;内置于shell,隻能在某種特定結構體中執行的指令;keyword
如:if,else,then,do,while,for,select,until,case,fi,esac.....
5.shell中的所有的特殊功能字元;
注意:所有被編寫進shell腳本文檔的指令,關鍵字及符号必須是ASCII編寫格式的字元,其他編碼 的格式的字元可以出現在shell腳本檔案中,但不具有任何特殊含義;
如何編寫shell腳本?
可以利用所有的文本文檔編輯工具進行腳本編寫,如:
nano,vi,vim,pico,emacs....
通常在Linux的各發行的版本中,推薦使用vim;
腳本檔案的命名方式:
一般情況下,會為腳本設定“.sh”的名稱字尾;比較低版本的編輯工具,會根據檔案的 字尾名稱來識别是否為shell腳本檔案,較高版本的檔案工具,如:vim7,無需過多的關 心檔案字尾名的問題。
腳本的運作方式:
1.為腳本檔案賦予執行權限,可以直接以絕對路徑或相對路徑的方式運作此檔案;
#chmod +x /PATH/TO/SOME_SCRIPT_FILE
#/PATH?TO/SOME_SCRIPT_FILE
注意:如果腳本檔案所在目錄路徑存儲于PATH變量中,則直接以腳本檔案名來執行即可;
2.直接使用解釋器運作腳本,将腳本檔案作為解釋器程式的參數;
# bash /PATH/TO/SOME_SCRIPT_FILE
bash指令的常用選項:
-x:使bash在解釋腳本的過程展示在标準輸出上;一般用于為shell腳本排錯;
-n:對腳本檔案進行預執行,以分析腳本中是否存在文法錯誤;如果沒有錯誤,則不 輸出任何資訊;相反,則輸出簡潔的提示資訊,具體錯誤定位需要自行判斷;
注意:此種方式中,腳本檔案是否有執行權限不是很重要的屬性;
注意:以上兩種方式,在執行腳本時,會在目前shell中開啟一個新的子shell運作腳本;一般情況 下,當腳本運作結束,該子shell也會被随之銷毀;是以,所有在腳本中定義的變量,在腳本 的末尾處最好将其明确的撤銷;gc
3.使用source指令來運作腳本
# source /PATH/TO/SOME_FILE
# ./PATH/TO/SOME_SCRLPT_FILE
注意:
1.source指令不會在運作腳本時開啟子shell,而是在目前shell中運作;
2.使用source指令執行的腳本中不要包括諸如exit類的指令;
利用bash腳本程式實作算數運算:
常用的基本算數運算符:
+,-,*,/,%,**
增強型的算數運算符:
+=,-=,*=,/=,%=
特殊的增強型算術運算符:
++,--
算數運算方法:
1.$[expression]
其中的表達式可以是純數字組成的,也可以是變量引用的變量值;在使用變量時,可以将$符号 省略;
例:
[root@localhost ~]# echo $[3*4]
12
2.let var=expression
根據算數表達式完成算術運算并指派給指定的變量;
[root@localhost ~]# let h='3*4'
[root@localhost ~]# echo $h
12
3.$((expression))
其中的表達式可以是純數字組成的,也可以使用變量引用變量值;在使用變量時,也可将$符号 省略;
4.expr ARGU1 ARGU2 ARGU3
其中ARGU1和ARGU3必須是整數數值;ARGUE2是算數運算符;
[root@localhost ~]# expr $[3*4]
5.echo "expression" | bc
例:
[root@localhost ~]# echo "3*4" | bc
12
6.bc <<<expression
[root@localhost ~]# bc <<< 3*4
文本處理工具:
全屏編輯器:vim,nano
行編輯器:
文本處理三劍客: grep系, sed, awk
grep系:grep, egrep, fgrep,文本搜尋工具;基于PATTERN(模式)對于給定的文本檔案進行 模糊搜尋, grep系所有指令預設工作于貪婪搜尋模式;
sed:Stream EDitor, 流編輯器 ,文本編輯工具;
awk:文本格式化工具,檔案報告生成器,檔案處理的程式設計語言;
grep系:
grep:Global Search Regular Expression and Print out the line
利用正規表達式進行全局搜尋并将比對到的行顯示出來;
格式:
grep [options] PATTERN [FILE...]
grep [options][-e PATTERN | -f FILE] [FILE...]
PATTERN:過濾比對條件,是由沒有特殊意義的文本字元或者是正規表達式元字元組成;
正規表達式的元字元:會被正規表達式處理引擎解釋為特殊含義的字元;
pcre:正規表達式處理引擎,prel語言的正規表達式引擎;
正規表達式的元字元:
基本的正規表達式元字元:BRE
字元比對類:
.:比對任意單個字元;
[]:比對任意指定範圍内的單個字元;
[^]:比對任意指定範圍以外的單個字元;
下列所有的字元集都可以放置于[]之中用于比對字元集範圍内的單個字元:
[:lower:]:所有的小寫字母;
[:upper:]:所有的大寫字母;
[:alpha:]:所有字母包括大小寫;
[:digit:]:所有單個的十進制數字;
[:xdigit:]:
[:alnum:]:所有的字母和十進制數字;
[:punct:]:所有的符号;
[:space:]:表示空白字元,包括空格和制表符;
[a-z]:僅表示所有的小寫字母
[A-Z]:僅表示所有的大寫字母
[0-9]:僅表示所有的十進制數位
次數比對類:該類字元前面的一個字元可以出現的次數;
*:其前面的字元可以出現任意次,即:0次,1次或多次;
\?:其前面的字元可有可無,即:0次或1次;
\+:其前面的字元至少出現一次;
\{m,n\}:其前面的字元至少出現m次,最多不超過n次;
\{m\}:其前面的字元必須出現m次;
\{m,\}:其前面的字元至少出現m次;
\{,n\}:其前面的字元出現至少出現0次,最多不超n次;
注意:在正規表達式中,表示任意長度的任意字元:.*
位置錨定字元:
1. 行錨定:
行首錨定:^
行尾錨定:$
2. 字錨定:
字首錨定:\<或\b
字尾錨定:\>或\b
例:找出/proc/meminfo中以S或s開頭的行
[root@localhost ~]# grep "^S\|^s" /proc/meminfo
SwapCached: 0 kB
SwapTotal: 1999868 kB
SwapFree: 1999868 kB
Shmem: 13624 kB
Slab: 107464 kB
SReclaimable: 52816 kB
SUnreclaim: 54648 kB
分組與前向引用字元:
\(\):将小括号中包含的内容作為一個不可分割的整體來處理;
\1, \2, \3,...:前向引用
正規表達式處理引擎的内置變量,\1表示前面所出現的第一組小括号中括選的内容;\2表示前面所 出現的第二組小括号中括選的内容;...
\(string1\(string2\)\): \1表示string1,\2表示string2;
\(string1\).*\(string2\):\1表示string1,\2表示string2;
例:找出其使用者名與shell名相同的使用者資訊;
[root@localhost ~]# grep "^\<\(.*\)\>.*\1$" /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
bash:x:8093:8093::/home/bash:/bin/bash
nologin:x:8096:8096::/home/nologin:/sbin/nologin
或者:
\|:将其左右的字元或字元串當做整體對待;
"C\|cat" C cat
例:找出ifconfig指令執行結果中的兩位或三位整數;
# ifconfig | grep "\<[1-9][0-9]\>\|\<[1-9][0-9][0-9]\>"
擴充的正規表達式元字元:ERE
字元比對類:
.:比對任意單個字元;
[]:比對任意指定範圍内的單個字元;
[^]:比對任意指定範圍以外的單個字元;
下列所有的字元集都可以放置于[]之中用于比對字元集範圍内的單個字元:
[:lower:]:所有的小寫字母;
[:upper:]:所有的大寫字母;
[:alpha:]:所有的字母,包括大小寫;
[:digit:]:所有單個的十進制數字;
[:xdigit:]:
[:alnum:]:所有的字母和十進制數字;
[:punct:]:所有的符号;
[:space:]:表示空白字元,包括空格和制表符;
[a-z]:僅表示所有的小寫字母
[A-Z]:僅表示所有的大寫字母
[0-9]:僅表示所有的十進制數位
次數比對類:該類字元前面的一個字元可以出現的次數;
*:其前面的字元可以出現任意次,即:0次,1次或多次;
?:其前面的字元可有可無,即:0次或1次;
+:其前面的字元至少出現一次;
{m,n}:其前面的字元至少出現m次,最多不超過n次;
{m}:其前面的字元必須出現m次;
{m,}:其前面的字元至少出現m次;
{,n}:其前面的字元出現至少出現0次,最多不超n次;
注意:在正規表達式中,表示任意長度的任意字元:.*
位置錨定字元:
行錨定:
行首錨定:^
行尾錨定:$
字錨定:
字首錨定:\<或\b
字尾錨定:\>或\b
分組與前向引用字元:
():将小括号中包含的内容作為一個不可分割的整體來處理;
\1, \2, \3,...:前向引用
正規表達式處理引擎的内置變量,\1表示前面所出現的第一組小括号中括選的内容;\2表示前面所出 現的第二組小括号中括選的内容;...
(string1(string2)): \1表示string1,\2表示string2;
(string1).*(string2):\1表示string1,\2表示string2;
或者:
|:将其左右的字元或字元串當做整體對待;
"C|cat" C cat
grep系:
grep:僅支援基本正規表達式元字元
egrep:可以支援擴充正規表達式元字元
fgrep:不支援任何形式的正規表達式元字元,将所有的字元都視為沒有任何特殊意義的普通文本字 符;
常用選項:
-A num:同時顯示被PATTERN比對到的行及其後續num行;
-B num:同時顯示被PATTERN比對到的行及其前面num行;
-C num:同時顯示被PATTERN比對到的行及其前後num行;
--color[=WHEN]:以高亮顔色顯示被比對到的内容;
-c, --count:不輸出被PATTERN比對的行的内容,而是輸出被PATTERN比對到的行數;
-E, --extended-regexp:可以使grep指令支援擴充正規表達式元字元;相當于執行了egrep指令;
-F, --fixed-strings:相當于fgrep;
-e PATTERN, --regexp=PATTERN:指定多個PATTERN在一個指令行中生效;
-f FILE, --file=FILE:從指定的檔案中讀取多個PATTERN用于一次搜尋;
-i, --ignore-case:忽略檔案中的字元的大小寫;
-o, --only-matching:僅顯示被PATTERN比對到的部分,關閉貪婪模式;
-q, --quiet, --silent:安靜模式;相當于 grep > /dev/null
-v, --invert-match:顯示沒有被PATTERN比對到的行;
例:輸出/etc/passwd中的bin
[root@localhost ~]# egrep -o "bin" /etc/passwd