編程語言和shell編程基礎
編程語言和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]
12
5.echo "expression" | bc
例:
[root@localhost ~]# echo "3*4" | bc
12
6.bc <<<expression
例:
[root@localhost ~]# bc <<< 3*4
12
文本處理工具:
全屏編輯器: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
本文出自 “計算機基礎” 博客,轉載請與作者聯系!
編程語言和shell編程基礎