一、Bash特性hash
二、Bash變量
三、Bash特性多指令行執行
四、Bash特性多指令執行
五、Profile和Bashrc
=========================================
一、Bash特性之hash
bash特性:
指令行展開:~,{}
指令别名:alias,unalias
指令曆史:history
檔案名通配:glob
快捷鍵:ctrl+{a,e,u,k,l}
路徑補全:
bash特性之:指令hash//指令補全
hash//儲存指令的執行結果
每一次查找PATH變量,會很慢,是以儲存上一次指令的查找結果
//再次運作一個指令的時候先查找hash然後查找PATH
hash自己是shell内建的指令,不用做hash,隻會對外部指令做hash
目的是加快指令查找速度
緩存此前指令的查找結果:key-value
key:搜尋鍵
value:值
-d删除某個記錄
hash-d dir //删除dir記錄
-r清空所有記錄
bash的特性之一:變量//bash為弱類型
程式:指令+資料
指令:由程式檔案提供
資料:IO裝置、檔案、管道
程式:算法+資料結構
變量名:指向記憶體中一段空間的起始位址
變量指派:name=value
bash隻有兩種類型:int和char
預設為char
變量類型:其實是變量中存儲值得資料類型
程式設計語言:
強類型變量:變量類型定以後,是不允許随便轉換的
c,除非進行類型轉換
弱類型:bash,
假若數字和字元進行轉換,自動進行轉換
bash預設為字元型
bash中的變量無需事先聲明,強類型需要實作聲明變量類型
相當于,把聲明和指派過程同時實作
變量替換:把變量名的位置替換為其所指向的記憶體空間中資料
變量引用:${var_name},$var_name
變量聲明:類型、變量名
變量名的命名方式:字母、數字、下劃線任意組合,但是不能以數字開頭
見名知義:命名機制遵循某種法則
不能使用保留字段:if,else,then,while等
變量類型:bash預設為字元類型,//按存儲類型劃分
字元型:
數值型:
變量類型:根據作用範圍劃分
本地變量:作用域僅僅是目前shell
環境變量:目前shell及其子shell
局部變量:目前shell的某一個代碼片段(函數上下文)
位置參數變量:當執行腳本的shell程序傳遞的參數
特殊變量:shell内置的有特殊功用的變量
$?:
0:成功
1-255:失敗
三、本地變量-環境變量-全局變量
pstree//顯示程序數
1.本地變量
變量指派:name=value
變量引用:${name},$name//有些是需要用引号的
"":弱引用:變量名會替換其值
'':強引用:變量名不會替換其值
檢視變量:set
變量引用:unsetname
注意:此處非變量引用,不使用$
2.環境變量
變量指派:export和declare
(1)exportname=value
(2)name=value
export name
(3)declare -xname=value
-x設定為環境變量
-i整形變量
-r<200b>隻讀變量,無法撤銷
readonlyname //即可設定變量為隻讀,無法撤銷
無法重新指派
目前shell程序終止後才會撤銷
(4)name=value
declare-x name
變量引用:${name},$name
注意:bash内嵌了很多環境變量,用于定義bash的工作環境
例如:PATH,HISTFILE,HISTFILESIZE,HISTCONTROL,SHELL,UID,PWD,HOME
全是大寫
檢視:export,declare -x ;printenv,env
撤銷:unset name
3.局部變量://多為函數内部變量
#!/bin/bash
functiontest(){
locale a //聲明局部變量
}
bash特性之多指令執行:
COMMAND1;COMMAND2;COMMAND3;...
邏輯運算:隻有真/假
真:true,yes,on,1
假:false,no,off,0
與:同時滿足
&&
iduser1 && echo ”yes"
//第一個失敗,第二個就不會執行
//第一個成功,第二個才會執行
或:隻要有一個為真即可
||
iduser1 || useradd user1
//第一個執行成功,就不會執行第二個
//第一個執行失敗,會執行第二個,并顯示第一個的執行結果
非:取反
!
異或:判斷是否不同
注:If ! a && b|| c //第一個!是針對a。并不是針對整個表達式
shell腳本程式設計的實作
1.程式設計語言分類:根據運作方式
編譯運作:源代碼-->編譯器(編譯)-->程式檔案
運作速度快,但是拍錯效率低
C語言:通過調用函數庫,或者類庫來完成
解釋運作;源代碼-->運作時啟動解釋器,由解釋器邊解釋邊運作
完全借助于外部的程式來完成
2.根據其程式設計過程功能的實作是調用庫還是調用外部的程式檔案:
shell腳本程式設計
利用系統上的指令及程式設計元件進行程式設計
完整程式設計:
利用庫和程式設計元件進行程式設計
程式設計:過程式程式設計語言,面向對象的程式設計語言
程式=指令+資料
過程式:以指令為中心來組織代碼,資料是服務于代碼
//一步一步來,一個時間順序
順序執行;選擇執行;循環執行
代表:C,bash,
對象式:以資料為中心來組織代碼,圍繞資料來組織指令
//根據不同的功能來實作
類:(class):執行個體化對象,method
代表:java,C++,Python //C++和Python同時支援面向對象和過程
2.shell腳本程式設計:特性
過程式程式設計、解釋執行依賴于外部程式檔案運作
如何寫shell腳本:
腳本檔案的第一行:頂格:給出shebang,解釋器路徑,用于指明解釋目前腳本的解釋器程式檔案
常見的解釋器:
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
文本編輯器:
行編輯工具:sed
全屏編輯工具:vim,vi,nano
運作腳本:
1.賦予執行權限呢,并直接執行此程式
chmod+x a.sh
./a.sh
2.使用解釋器運作
bash a.sh
注意:腳本中的空白行會被解釋器忽略
腳本中,除了shebang,餘下的所有以#開頭的行,都會被視為注釋行
//shell腳本是通過運作一個子shell程序中執行的
3.bash的配置檔案
兩類:
profile類:為互動式登入的shell程序提供配置
bashrc類:為非互動式登入的shell程序提供配置
登入類型:
互動式登入shell程序:
直接通過某終端輸入賬号和密碼後登入打開的shell程序
使用su指令,su -USERNAME,或者使用su -l USERNAME執行的登入切換
非互動式的登入:
su USERNAME執行的登入切換
在圖形界面下打開的終端:
運作腳本
profile類://登入的時候執行
全局:對所有使用者都生效
/etc/profile
/etc/profile.d/*.sh
局部的:對單個使用者生效
~/.bash_profile
功用:
1.用于定義環境變量
2.運作指令或者腳本
bashrc類://運作指令的時候使用
全局:對所有使用者生效
/etc/bashrc
局部的:對單個使用者生效
~/.bashrc
功用:
1.定義本地變量
2.定義指令别名
注意:僅僅管理者可以修改全局配置檔案
互動式登入shell程序:
/etc/profile--->/etc/profile.d/*.sh --->~/.bash_profile
//假如沖突的話,後讀取的生效
非互動式的登入shell程序:
~/.bashrc--->/etc/bashrc-->/etc/profile.d/*
指令行中定義的特性:例如變量和别名僅對目前shell程序的生命周期;
配置檔案定義的特性,隻對随後重新啟動的shell程序有效
讓通過配置檔案定義的特性立即生效;
(1)通過指令行重複定義一次
(2)讓shell程序重讀配置檔案
#source/PATH/FROM/CONF_FILE
./PATH/FROM/CONF_FILE
~]#. .bashrc //第一個 . 是引用,第二個是檔案名
4.讓所有使用者登入時都顯示資訊
vim/etc/profile.d/welcome.sh
echo"hello welcome"
附件一:面向對象和面向過程
面向過程就是分析出解決問題所需要的步驟,然後用函數把這些步驟一步一步實作,使用的時候一個一個依次調用就可以了。
面向對象是把構成問題事務分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描叙某個事物在整個解決問題的步驟中的行為。
例如五子棋,面向過程的設計思路就是首先分析問題的步驟:
1、開始遊戲,2、黑子先走,3、繪制畫面,4、判斷輸赢,5、輪到白子,6、繪制畫面,7、判斷輸赢,8、傳回步驟2,9、輸出最後結果。把上面每個步驟用分别的函數來實作,問題就解決了。
面向對象的設計。整個五子棋可以分為:
1、黑白雙方,這兩方的行為是一模一樣的,
2、棋盤系統,負責繪制畫面,
3、規則系統,負責判定諸如犯規、輸赢等。第一類對象(玩家對象)負責接受使用者輸入,并告知第二類對象(棋盤對象)棋子布局的變化,棋盤對象接收到了棋子的i變化就要負責在螢幕上面顯示出這種變化,同時利用第三類對象(規則系統)來對棋局進行判定。
附件二:bashrc和profile的差別
bashrc是shell的環境配置檔案
profile是登入系統用的配置檔案
附件三:bash配置檔案
bash配置檔案:
profile類:登入shell //su - USERNAME,su -l USERNAME
bashrc類:非登入shell提供 //su USERNAME,shell程序,圖形終端的終端
讀取配置檔案順序:
登入式shell:/etc/profile-->/etc/profile.d/*.sh--->~/.bash_profile-->~/.bashrc--->/etc/bashrc //profile到bashrc
非登入shell:~/.bashrc--->/etc/bashrc-->/etc/profile.d/*.sh //bashrc到*.sh
本文轉自MT_IT51CTO部落格,原文連結:http://blog.51cto.com/hmtk520/1976980,如需轉載請自行聯系原作者