Linux是一套免費使用和自由傳播的類UNIX操作系統,是一個基於POSIX和Unix的多使用者、多工、支援多執行緒和多CPU的操作系統。它能執行主要的Unix工具軟體、應用程式和網路協定。它支援32位元和64位元硬體。Linux繼承了Unix以網路爲核心的設計思想,是一個效能穩定的多使用者網路操作系統。
什麼是開源
開源,即開放原始碼;使用者可以免費的使用它並且可以獲得它的原始碼,更爲重要的是可以根據自己的需要對它進行必要的修改,無償使用,無約束地繼續傳播。開源是一種「共用的」、「免費的」、「可革新」的軟體模式。
linux 基本結構
如圖所示:Linux 系統可以簡單的抽象分爲 Linux 操作系統(linux內核)、 Shell 層(命令解釋執行層)和應用層。
內核層
內核層是 Linux 系統的核心和基礎,它直接附着在硬體平臺之上,控制和管理系統內各種資源(硬體資源和軟體資源),有效地組織進程的執行,從而擴充套件硬體的功能,提高資源的利用效率,爲使用者提供方便、高效、安全、可靠的應用環境。
Shell層
Shell 層是與使用者直接互動的介面,同時也是和linux系統內核相連線。使用者可以在提示符下輸入命令列,由 Shell 解釋執行並輸出相應結果或者有關資訊,所以我們也把 Shell 稱作命令直譯器,利用系統提供的豐富命令可以快捷而簡便地完成許多工作。事實上,Shell本質上就是應用程式,但是它和系統內核直接相互動,而其他使用者程式則和Shell指令碼互動,是一種內核和使用者程式之間的紐帶。
應用層
應用層提供基於 X Window 協定的圖形環境。X Window 協定定義了一個系統所必須具備的功能(就如同 TCP/IP 是一個協定,定義軟體所應具備的功能),可系統能滿足此協定及符合 X 協會其他的規範,便可稱爲 X Window。值得注意的是,絕大部分linux使用者都不選擇安裝X Window影象介面,佔記憶體,功能低,是linux作爲伺服器來說吃力不討好的那種情況。
Linux 開機啓動過程
在 Linux 操作系統中,所有被操作系統管理的資源,例如網路介面卡、磁碟驅動器、印表機、輸入輸出裝置、普通檔案或是目錄都被看作是一個檔案。
也就是說在 Linux 系統中有一個重要的概念**:一切都是檔案**。其實這是 Linux 繼承 Unix 哲學的一個體現,在 Unix 系統中,把一切資源都看作是檔案,包括硬體裝置。Unix 系統把每個硬體都看成是一個檔案,通常稱爲裝置檔案,這樣使用者就可以用讀寫檔案的方式實現對硬體的存取。
linux 基本檔案型別分類如下圖所示
linux 目錄結構層次分明,如圖所示
常見目錄說明:
/bin: 存放二進制可執行檔案(ls,cat,mkdir等),常用命令一般都在這裏;
/etc: 存放系統管理和組態檔;
/home: 存放所有使用者檔案的根目錄,是使用者主目錄的基點,比如使用者user的主目錄就是/home/user,可以用~user表示;
**/usr **: 用於存放系統應用程式;
/opt: 額外安裝的可選應用程式包所放置的位置。一般情況下,我們可以把jdk、tomcat等都安裝到這裏;
/proc: 虛擬檔案系統目錄,是系統記憶體的對映。可直接存取這個目錄來獲取系統資訊;
/root: 超級使用者(系統管理員)的主目錄(特權階級o);
/sbin: 存放二進制可執行檔案,只有root才能 纔能存取。這裏存放的是系統管理員使用的系統級別的管理命令和程式。如ifconfig等;
/dev: 用於存放裝置檔案;
/mnt: 系統管理員安裝臨時檔案系統的安裝點,系統提供這個目錄是讓使用者臨時掛載其他的檔案系統;
/boot: 存放用於系統引導時使用的各種檔案;
**/lib **: 存放着和系統執行相關的庫檔案 ;
/tmp: 用於存放各種臨時檔案,是公用的臨時檔案儲存點;
/var: 用於存放執行時需要改變數據的檔案,也是某些大檔案的溢位區,比方說各種服務的日誌檔案(系統啓動日誌等。)等;
/lost+found: 這個目錄平時是空的,系統非正常關機而留下「無家可歸」的檔案(windows下叫什麼.chk)就在這裏。
block,簡單來說,就是linux系統讀取硬碟的記憶體中快取區域的一塊區域,值得注意的是,block,是linux系統規定記憶體每次讀取最小的記憶體單位,大小爲4KB;它是由8個linux硬碟規定的每次儲存最小單元「磁區」( sector)這麼大,也就是說每個磁區儲存512位元組,其實這兩個是非常重要的概念,貫穿整個硬體和記憶體。
inode是索引節點。是linux檔案或目錄物理儲存位置的體現,它具備基本索引所有的特點,包括檢索快、相同檔案唯一性等特點。
首先,先不談硬鏈接和軟鏈接是什麼,我們按照以下程式碼去建立:
#建立原檔案
touch test check
#建立硬鏈接
ln /root/test /tmp/a-hard
#建立軟鏈接
ln -s /root/check /tmp/check-soft
硬鏈接的原理如下圖所示,硬鏈接和原檔案讀寫的是相同的block塊,俺就說明讀寫硬鏈接事實上就是讀取原檔案;**硬鏈接相當於一個原檔案的備用可替換檔案,**只要兩者存在一個,就能夠實現原檔案的功能。對其增刪改查,事實上就是操作原檔案,但是值得注意的是刪除原檔案,硬鏈接的內容還是可以讀取的,這是因爲inode還是存在的,這是容易忽略的。
軟鏈接的原理如下圖所示,軟鏈接和原檔案的讀寫本質上都是相同的inode,但是記憶體快取區的塊不一樣,但是軟鏈接的塊是讀取原檔案的,可以這樣理解軟鏈接的塊是原檔案塊的硬鏈接。軟鏈接相當於一個快捷方式,對其增改查,事實上就是操作原檔案,但是刪除,卻不是刪除原檔案,而是刪除自己;軟鏈接直接依賴原檔案的存在而存在。
硬鏈接不會建立自己的 inode 索引和 block(數據塊),而是直接指向原始檔的 inode 資訊和 block,所以硬鏈接和原檔案的 inode 號是一致的;而軟鏈接會真正建立自己的 inode 索引和 block,所以軟鏈接和原始檔的 inode 號是不一致的。硬鏈接不可以跨分割區,軟體鏈可以跨分割區。刪除硬鏈接檔案,不會刪除原檔案,刪除軟鏈接檔案,會把原檔案刪除。
BASH命令區分大小寫,而DOS命令則不區分;
在BASH下,/是目錄分隔符,\作爲跳脫字元。在DOS下,/用作命令參數分隔符,\是目錄分隔符
DOS遵循命名檔案中的約定,即8個字元的檔名後跟一個點,擴充套件名爲3個字元。BASH沒有遵循這樣的慣例。
Shell 是一個應用程式,它連線了使用者和 Linux 內核,讓使用者能夠更加高效、安全、低成本地使用 Linux 內核,這就是 Shell 的本質。
Shell 指令碼是一門邊解釋邊執行的弱語言機制 機製的程式語言,因其簡單、易用、高效,所以說它是大多數linux命令列命令的首選語言。
執行shell指令碼的方式
#方法一:shell指令碼的第一行必須宣告:#!/bin/bash
#建立shell 指令碼
touch text.sh
chmod u+x text.sh
#執行shell指令碼(當前目錄下)
./text.sh
#方法二:使用/bin/bash的直譯器執行
#執行shell指令碼
bash text.sh
# 方法三:當前進程執行shell指令碼(可以忽略指令碼的許可權,可以不是可執行檔案)
#執行shell指令碼
source text.sh
Shell 中變數的值都是以字串的形式進行儲存的,shell變數和其他弱語言機制 機製一樣無需宣告,直接使用;過程中無型別限制。
shell變數賦值的時候「=「」兩側不能有空格。原因是shell中一切皆字串的原因,空格也會被當做爲字串的一部分。
分類
單引號‘’、雙引號「」和反引號``的區別
單引號‘’:字串常數;任何字元都會原樣輸出,在其中使用變數包括跳脫符都是無效的。
雙引號「」:模板字串;變數會被解析,跳脫符會生效。
反引號``:命令表達式,只能放linux命令。相當於$(…)
字串和陣列常用方法(瞭解)
事實上shell指令碼主要是用來執行linux命令的,而其也提供了一些字串和陣列的方法,但這些方法對於使用命令來說,基本上不用。
字串 str=」…」
1. 獲取字串的長度 ${#str}
2. 字串拼接
a) $str1$str2 中間不能有空格
b) 「$str1 $str2」 中間有空格
c) $str1」-」$str2 中間可以有其他字串
d) str4="$name: $url" #這樣寫也可以
e) str5="${name}Script: ${url}index.html" #這個時候需要給變數名加上大括號
3. 字串擷取:${string: start [:length]} 從0開始,包括start,擷取長度爲length
4. 反向擷取字串:${string: 0-start [:length]} 從1開始,包括start
5. 從指定字串開始擷取(左邊開始)
a) ${string#[*]chars}:*爲萬用字元,chars不包括,第一次出現開始擷取
b) ${string##*chars}:*爲萬用字元,chars不包括,最後一次出現開始擷取
6. 從指定字串開始反向擷取(右邊開始)
a) ${string%chars*}
b) ${string%%chars*}
陣列
1. 宣告:
a) array_name=(ele1 ele2 ele3 ... elen) #陣列型別可以不相同
b) array_name=([3]=24 [5]=19 [10]=12) #指定陣列下標宣告
2. array_name[n]=… 賦值
3. 獲取陣列元素
a) ${nums[*]}或者${nums[@]} #獲取陣列所有元素
b) ${array_name[index]} #index從0開始
4. 陣列長度 ${#array_name[@]}或者${#array_name[*]} #元素的個數,和下標無關
5. 刪除陣列元素:unset array_name[index]
6. 刪除陣列:unset array_name
7. 陣列的拼接
array_new=(${array1[@]} ${array2[@]})
array_new=(${array1[*]} ${array2[*]})
備註:[]代表可選操作
算術表達式
$((EXP)): 使用變數時不用加爲 獲取表達式的值 ,當表達式有多個結果時以最後一個表達式的結果作爲整個(())命令的執行結果。
$[EXP]: EXP爲表達式。
expr EXP :分佈計算。注意:*表示乘法,其他相同,運算子前後必須加空格
例如:S=expr 2 \* 3
let簡單表達式
條件表達式
Shell 條件表達式的結果是0(true)和1(false),這一點和其他語言不一樣。
關於條件表達式shell有三種表達式,但是最常用的就是[ condition ](兩邊均有空格),其他不常用,不做介紹。值得注意的是條件表達式中的算術運算子要被「-eq -ne -gt -lt -ge -le」它們所替代,邏輯運算子「&& || !」被「-a -o !」取代。有的時候也可以用(())來取代,它支援所有的以上運算子。
之前看到的3張表,我覺得很詳細,於是先借用它們來說:
上述三張表已經非常清晰的解釋了shell 程式設計的輸入和輸出重定向了。我主要說一下linux中最常用的三種輸出重定向。
這三種是我們最常用的輸出重定向,主要用於我們使用shell指令碼去啓動我們的應用程式,比如說elasticsearch,我們並不想在控制檯去看他的正常和提示資訊,因爲提示資訊太長,這時候我們就需要將輸出的這些資訊記錄在日誌檔案中,方便我們去檢視資訊。此外,下面 下麪也是我們常用的結束後臺執行的命令:
#!/bin/bash
INSTALL=/opt/install/java/
JDK=jdk-8u111-linux-x64.tar.gz
TOMCAT=apache-tomcat-8.5.57.tar.gz
BIGDATA=/opt/bigdata/java/
CMD=''
show(){
msg=''
for p in $*
do
msg=$msg' '$p
done
}
err(){
show $*
if [ $? -ne 0 ]
then
echo '異常:'$msg
exit 1
else
echo '成功:'$msg
fi
}
if [ -e $BIGDATA ]
then
echo "${BIGDATA} exist"
else
CMD="mkdir -p ${BIGDATA}"
$CMD
err "建立目錄 ${BIGDATA}"
fi
CMD="cd ${INSTALL}"
$CMD
err "${CMD}"
CMD="tar -zxf ${JDK} -C ${BIGDATA}"
$CMD
err "${CMD}"
CMD="tar -zxf ${TOMCAT} -C ${BIGDATA}"
$CMD
err "${CMD}"
CMD="mv ${BIGDATA}apache-tomcat-8.5.57/ ${BIGDATA}tomcat85/"
$CMD
err "${CMD}"
CMD="mv ${BIGDATA}jdk1.8.0_111/ ${BIGDATA}jdk180/"
$CMD
err "${CMD}"
CMD=`sed -i "/unset i/i\export JAVA_HOME=${BIGDATA}jdk180" /etc/profile`
$CMD
err "create environment variable JAVA_HOME"
CMD=`sed -i "/unset i/i\export TOMCAT_HOME=${BIGDATA}tomcat85" /etc/profile`
$CMD
err "create environment variable TOMCAT_HOME"
CMD=`sed -i '/unset i/i\export PATH=$JAVA_HOME/bin:$TOMCAT_HOME/bin:$PATH' /etc/profile`
$CMD
err "create environment variable PATH"
CMD=`sed -i '/unset i/i\export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar' /etc/profile`
$CMD
err "create environment variable CLASSPATH"
CMD="source /etc/profile"
$CMD
err "${CMD}"
echo "發佈 jdk && tomact 成功"
結果:
[root@vm03 ~]# ./deployloyjt.sh
成功: 建立目錄 /opt/bigdata/java/
成功: cd /opt/install/java/
成功: tar -zxf jdk-8u111-linux-x64.tar.gz -C /opt/bigdata/java/
成功: tar -zxf apache-tomcat-8.5.57.tar.gz -C /opt/bigdata/java/
成功: mv /opt/bigdata/java/apache-tomcat-8.5.57/ /opt/bigdata/java/tomcat85/
成功: mv /opt/bigdata/java/jdk1.8.0_111/ /opt/bigdata/java/jdk180/
成功: create environment variable JAVA_HOME
成功: create environment variable TOMCAT_HOME
成功: create environment variable PATH
成功: create environment variable CLASSPATH
成功: source /etc/profile
發佈 jdk && tomact 成功
[root@vm03 ~]# cat /etc/profile | tail -8
export JAVA_HOME=/opt/bigdata/java/jdk180
export TOMCAT_HOME=/opt/bigdata/java/tomcat85
export PATH=$JAVA_HOME/bin:$TOMCAT_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
unset i
unset -f pathmunge
[root@vm03 ~]#