編程基礎(chǔ)
程序:
?????? 程序:算法+數(shù)據(jù)結(jié)構(gòu)
?????? 數(shù)據(jù):程序的核心
?????? 數(shù)據(jù)結(jié)構(gòu):數(shù)據(jù)在計(jì)算機(jī)中的類型和組織方式
?????? 算法:處理數(shù)據(jù)的方式
編程風(fēng)格:
?????? 過程式:以指令為中心眷蚓,數(shù)據(jù)服務(wù)于指令
?????? 對(duì)象式:以數(shù)據(jù)為中心吹截,指令服務(wù)于數(shù)據(jù)
程序的執(zhí)行方式:
?????? 計(jì)算機(jī):執(zhí)行二進(jìn)制指令
?????? 編程語言:
????????????? 低級(jí)編程語言:
???????????????????? 機(jī)器:二級(jí)制序列,機(jī)器指令
???????????????????? 匯編:采用一些助記符號(hào)替代機(jī)器指令
????????????? 高級(jí)編程語言:
???????????????????? 編譯型:高級(jí)語言->編譯器->機(jī)器代碼->執(zhí)行(C胶背,C++等)
???????????????????? 解釋型:高級(jí)語言->執(zhí)行->解釋器->機(jī)器代碼(python,shell等)
編程基本概念:
?????? 邏輯處理:順序執(zhí)行饲漾、循環(huán)執(zhí)行珍剑、選擇執(zhí)行
?????? 基本結(jié)構(gòu):相關(guān)語句、數(shù)據(jù)存儲(chǔ)穆壕、表達(dá)式
SHELL腳本基礎(chǔ)
腳本規(guī)范:
?????? 首行shebang機(jī)制(#!)待牵,聲明腳本所調(diào)用的語言
?????? 后續(xù)應(yīng)包括以下內(nèi)容:程序名、版本號(hào)喇勋、更改時(shí)間缨该、作者相關(guān)信息、相關(guān)協(xié)議等
shell腳本用途:
?????? 自動(dòng)化常用命令
?????? 執(zhí)行系統(tǒng)管理和故障排除
?????? 創(chuàng)建簡(jiǎn)單的應(yīng)用程序
?????? 處理文本或文件
shell腳本結(jié)構(gòu):
?????? #!shebang?????????????????????? (shebang機(jī)制)
?????? Configuration_Variables????? (參數(shù)變量)
?????? Function_Definition???????????? (函數(shù)定義)
?????? Main_Code???????????????????????? (主要代碼)
shebang機(jī)制:
?????? shebang= #(sharp) + !(bang)
????????#! +解釋器絕對(duì)路徑:用于指明執(zhí)行這個(gè)腳本文件的解釋器川背。
變量
相關(guān)概念:
?????? 定義:變量即命名的內(nèi)存空間贰拿,指明存放數(shù)據(jù)的地址(門牌號(hào))蛤袒。
?????? 強(qiáng)類型:需要經(jīng)過函數(shù)強(qiáng)制轉(zhuǎn)換才能改變數(shù)據(jù)類型(Java、python等)
?????? 弱類型:與嚴(yán)峻形勢(shì)會(huì)隱式做數(shù)據(jù)類型轉(zhuǎn)換膨更,無需指定妙真,默認(rèn)為字符型(bash等)
?????? 命名法則:
????????????? 不能使用程序保留字,如if荚守、for等
????????????? 只能使用數(shù)字珍德、字母和下劃線,且不能以數(shù)字開頭
????????????? 統(tǒng)一命名規(guī)則:駝峰命名法健蕊、下劃線分隔命名
bash變量:
?????? ?????? ????????????????????????*只讀變量:只能聲明菱阵,但不能修改和刪除。
???????????????????????????????????????????????????? 聲明:readonly name或declare –r name
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?查看:readonly -p
????????相關(guān)命令:
???????????????????? 顯示變量:set(局部)缩功;env晴及、export、declare –x嫡锌、printenv(全局)
???????????????????? 刪除變量:unset name虑稼;set --(清空所有位置變量)
bash退出狀態(tài)
????????退出狀態(tài)碼:0代表成功;1-255代表失敗(使用$?查看最近命令的退出狀態(tài))
????????自定義退出狀態(tài)碼:exit
????????num(不超過255)
????????*腳本一旦遇到exit命令势木,會(huì)立即終止蛛倦,退出狀態(tài)取決于exit命令后的數(shù)字;如果未給腳本指定退出exit命令啦桌,腳本退出狀態(tài)碼取決于腳本執(zhí)行的最后一條命令的狀態(tài)碼溯壶。
????????*執(zhí)行腳本一般直接寫腳本名稱或bash腳本,不使用source或. 執(zhí)行甫男,因?yàn)楫?dāng)腳本中存在exit命令時(shí)后兩種執(zhí)行方式會(huì)注銷且改,而前兩種是在創(chuàng)建的子進(jìn)程中執(zhí)行
bash運(yùn)算
bash算術(shù)運(yùn)算:
?????? 命令:let、$[ ]板驳、$(( ))又跛、$(expr )、declare –i若治、echo “…“|bc
?????? 運(yùn)算符:+慨蓝、-、*端幼、/礼烈、%、**静暂、增強(qiáng)型賦值(++济丘、--、+=洽蛀、-+摹迷、*=、/=郊供、%=)
?????? [eg]將3*4運(yùn)算結(jié)果賦值給var
????????????? letvar=3*4峡碉;var=$[3*4];var=$((3*4))驮审;var=$(expr 3*4)鲫寄;
? ? ? ? ? ? ? declare –i var=3*4;var=`echo “3*4”|bc`
bash邏輯運(yùn)算:
?????? 邏輯值:true(1)疯淫、false(0)
?????? 與或非:
????????????? 與:和1相與的保留原值地来、和0相與的全部為0,進(jìn)行二進(jìn)制轉(zhuǎn)換
????????????? 或:和1相與的全部為1熙掺、和0相或的保留原值未斑,進(jìn)行二進(jìn)制轉(zhuǎn)換
????????????? 非:取相反邏輯值,不進(jìn)行二進(jìn)制轉(zhuǎn)換
?????? 短路:
????????????? 短路與:前者為0時(shí)不考慮后者
????????????? 短路或:前者為1時(shí)不考慮后者
? ? ? ? ? ? ? cmd1&&cmd2:cmd1為真時(shí)執(zhí)行cmd2币绩,為假時(shí)不執(zhí)行cmd2
? ? ? ? ? ? ? cmd1||cmd2:cmd1為真時(shí)不執(zhí)行cmd2蜡秽,為假時(shí)執(zhí)行cmd2
?????? 異或:
????????????? ^:異或的兩個(gè)值相同為0,不同為1(同性相斥)
bash測(cè)試
條件測(cè)試:
?????? 測(cè)試機(jī)制:判斷某需求是否滿足缆镣,為真返回0芽突,為假返回1
?????? 測(cè)試命令:test、[ expression ]董瞻、[[expression ]]
條件性執(zhí)行操作符:
?????? &&:代表?xiàng)l件性的and then寞蚌,等同于-a
?????? ||:代表?xiàng)l件性的or else,等同與-o
bash數(shù)值測(cè)試:
?????? -vvar(變量var是否設(shè)置)钠糊、-gt(大于)挟秤、-ge(大于等于)、-lt(小于)眠蚂、-le(小于等于)煞聪、
?????? -eq(等于)、-ne(不等于)
bash字符串測(cè)試:
?????? =逝慧、>昔脯、<、!=笛臣、=~(左側(cè)字符串是否能被右側(cè)pattern匹配云稚,一般用于[[ ]]中)
?????? *用于字符串比較時(shí)用到的操作數(shù)都應(yīng)該使用引號(hào),比較符號(hào)前后注意加空格
?????? [eg]str=abcde;[[ “$str” =~ abc?? ]]&&echo true||echo false
bash文件測(cè)試:
?????? 存在性測(cè)試:-a(文件存在)沈堡、-e(同-a)静陈、-b(存在且為塊設(shè)備)、-c(存在且為字符設(shè)備)、
????????????????????????????-f(存在且為普通文件)鲸拥、-d(存在且為目錄文件)拐格、-h(存在且為鏈接文件)、
????????????????????????????-p(存在且為命名管道文件)刑赶、-s(存在且為套接字文件)
?????? 權(quán)限測(cè)試:-r(存在且可讀)捏浊、-w(存在且可寫)、-x(存在且可執(zhí)行) 撞叨、-u(存在且有suid)金踪、
????????????????????????-g(存在且有sgid)、-k(存在且有sticky)
屬性測(cè)試:-s(存在且非空)牵敷、-f(文件描述符是否在某終端打開)胡岔、-O(當(dāng)前用戶是否屬主)、
? ? ? ? ? ? ? ? ? -G(當(dāng)前用戶是否屬組)枷餐、-N(自上次讀取后是否被修改過)
bash命令行展開
????????????命令行分成單個(gè)命令詞->展開別名->展開大括號(hào)聲明{ }->展開波浪符聲明~->命令替換$( ) ->再次將命令行分成單個(gè)命令詞->展開文件通配符->準(zhǔn)備I/O重導(dǎo)向->運(yùn)行命令
相關(guān)練習(xí)
1.編寫腳本/root/bin/backup.sh靶瘸,可實(shí)現(xiàn)每日將/etc/目錄備份到?/root/etcYYYY-mm-dd中
2.編寫腳本/root/bin/nologin.sh和login.sh,實(shí)現(xiàn)禁止和允許普通用戶登錄系統(tǒng)
3.編寫腳本/root/bin/disk.sh,顯示當(dāng)前硬盤分區(qū)中空間利用率最大的值