一. Shell介紹:命令的集合
-
用戶恨闪,shell藕甩,內(nèi)核關(guān)系:
1.png -
基本簡(jiǎn)介
(1)#!指明解釋器 與 賦予可執(zhí)行權(quán)限
在腳本內(nèi)指明解釋器: #!/bin/bash
給腳本可執(zhí)行權(quán)限: chmod +x xx.sh
(2)執(zhí)行腳本:./xx.sh 或者 /bin/bash xx.sh 或 (命令笔宿;命令火鼻;命令)
[oracle@localhost ~]$ (cd go;ls -al)
2.png
3.png
(3)查看當(dāng)前系統(tǒng)所使用的shell方式:echo $SHELL
(4)shell操作的本質(zhì):fork一個(gè)子進(jìn)程并調(diào)用exec執(zhí)行xx.sh這個(gè)程序
(5)行注解: #
多行注解:(注:下面的隶垮!可換成其他的符號(hào))
:<<!
!
(6)echo 用于字符串的輸出(自動(dòng)換行)
顯示轉(zhuǎn)移字符:echo ""It is a test"" #輸出的帶雙引號(hào)
-
顯示變量的值:echo “$變量”
read name # read 命令從標(biāo)準(zhǔn)輸入中讀取一行藻雪,并賦值其后的而變量 echo "$name It is a test" #輸出的是變量name的值。
顯示換行:echo -e "OK! \n" # -e 開啟轉(zhuǎn)義
顯示不換行 echo -e "OK! \c" # -e 開啟轉(zhuǎn)義 \c 不換行
即下面的輸出會(huì)在本行繼續(xù)輸出狸吞。-
單引號(hào)勉耀,原樣輸出字符串,不轉(zhuǎn)移蹋偏,不輸出變量:
echo '$name\"'
-
顯示結(jié)果重定向到文件:
echo "It is a test" > myfile
-
使用的是反引號(hào)
輸出命令的執(zhí)行結(jié)果: echo
命令`
(7)printf輸出命令(手動(dòng)換行\(zhòng)n)
格式: printf 格式 參數(shù) #格式可選- printf "Hello, Shell\n" # hello, shell
- printf "%-10s %-8s %d\n" 路飛 男 66 #
%-10s 指一個(gè)寬度為10個(gè)字符(-表示左對(duì)齊便斥,沒有則表示右對(duì)齊)
%d 整形; %-4.2f 指格式化為小數(shù)威始,其中.2指保留2位小數(shù)
注: 上面的格式枢纠,可雙引號(hào),可單引號(hào)黎棠, 可無引號(hào)晋渺。
- 變量—》shell中的變量的值都是字符串, 不需要聲明脓斩。
(1)分類: 環(huán)境變量與 本地變量
環(huán)境變量是任何進(jìn)程都有的概念木西,而本地變量是Shell特有的概念**
定義變量:變量名不加美元符號(hào)且等號(hào)兩邊都不能有空格: varname=value
只讀變量:(值不可修改,先賦值)readonly 命令修飾—》readonly myUrl使用定義過變量:變量名前面加美元符號(hào)—》$varname 或者 ${變量名}
刪除變量:unset命令刪除環(huán)境/本地變量随静。 unset varname
(2) 字符串: 可單引號(hào)八千,可雙引號(hào)
-
單引號(hào): 內(nèi)部的任何字符都會(huì)原樣輸出吗讶,即內(nèi)部的變量是無效的。
注:當(dāng)單引號(hào)內(nèi)部出現(xiàn)成對(duì)的單引號(hào)時(shí)—》起到拼接字符串作用恋捆。
雙引號(hào): 里可以有變量照皆, 可以出現(xiàn)轉(zhuǎn)義字符。
拼接字符串: 使用單引號(hào) 或 雙引號(hào)
var_name="12"
var1="hello,”$var_nam”" #雙引號(hào)拼接
var_2='hello, '$var_name'’ #單引號(hào)拼接
echo $var1 $var2
- 獲取字符串長(zhǎng)度:${#string}
- 字符串截瑞拧:echo ${string:0:4} #從第0個(gè)開始纵寝,一共獲取4個(gè)
方式1: 路徑分割: dirname命令(目錄), basename命令(名稱)
例子: Var1=“/etc/xiawucha.txt”
dirname $var1 #得:/etc
basename $var1 #得:xiawucha.txt
方式2: 使用expr命令:expr substr $變量名 起始位置 截取長(zhǎng)度
注:起始位置從1開始
方式3: 使用 ${} 表達(dá)式: ${變量名 :起始位置 : 截取長(zhǎng)度}
注: 編號(hào)從0開始
var1= xiawucha
expr substr $var1 4 4 #得: wuch
echo ${var1:4:4} #得: ucha
- 字符串替換
同樣使用${}
格式1: ${var1 /old/new} #將變量中的 第一個(gè)old 變成 new
格式2: ${var1 //old/new} #將變量中的 所有old 變成 new
注: old星立,new代表字符爽茴。
(3) 數(shù)組: 只支持一維數(shù)組,但沒有限制數(shù)組大小绰垂,下標(biāo)從0開始
-
定義數(shù)組: 使用()代表數(shù)組室奏,內(nèi)部值使用空格或換行分割。
array_name=(v0 v1 v2 v3)
-
獲取數(shù)組的值:${數(shù)組名[下標(biāo)]}
獲取數(shù)組的所有值劲装,使用@:${數(shù)組名[@]}
取得數(shù)組元素的個(gè)數(shù) length=${#array_name[@]} 或?qū)換成 * 好
取得數(shù)組單個(gè)元素的長(zhǎng)度lengthn=${#array_name[n]}
(4)使用變量
1)三種定界符號(hào): 雙引號(hào)胧沫,單引號(hào), 反撇號(hào)或$()
雙引號(hào): 允許引用占业,允許轉(zhuǎn)義\
單引號(hào): 進(jìn)制 引用 與 轉(zhuǎn)義绒怨; 代表其: 本事的符號(hào)。
反撇號(hào) 或者 $() :以命令輸出進(jìn)行替換谦疾。
echo “變量名” : 輸出的變量的值南蹂, 一般都省略 “”。
echo ‘變量名’ : 輸出還是變量的名念恍。
A= ‘命令’ :將命令輸出的值賦值給變量媒楼。 或者使用$()
2)創(chuàng)建的環(huán)境變量翠订。 目的:用來記錄家凯、設(shè)置運(yùn)行參數(shù)
系統(tǒng)賦值:USER, LOGNAME, HOME, SHELL...
用戶操作:PATH, LANG, CLASSPATH ....
列出所有的環(huán)境變量: env
同時(shí)輸出多個(gè)環(huán)境變量的值: echo $USER $HOME $SHELL
3)特殊的變量: 由系統(tǒng) 或 腳本控制程帕, 不可直接賦值。
$? 記錄前一條命令執(zhí)行后的狀態(tài)值瞳氓,為0:代表前一個(gè)命令執(zhí)行成功策彤,否則失敗
$0 腳本自身的程序名
$1-$9 第一到第9個(gè)位置的參數(shù)。
$* 命令行的所有位置參數(shù)的內(nèi)容
$# 命令行的位置參數(shù)個(gè)數(shù)
2. 運(yùn)算符
原生bash不支持簡(jiǎn)單的數(shù)學(xué)運(yùn)算匣摘,但可以通:awk 和 expr锅锨,expr 等實(shí)現(xiàn):
(1) 算數(shù)運(yùn)算符:
加(+), 減(1)恋沃,乘(*)必搞,除(/), 取余(%)囊咏,賦值(=)
特別: 相等(==)恕洲, 不相等(塔橡!=)-》放在方括號(hào)[]之間,并且前后要有空格
例子:`expr 2 + 2` # 使用 反引號(hào)霜第,不是單引號(hào)葛家。
a=10
b=20
val=`expr $b / $a`
echo "b / a : $val" # b / a : 2
例子:
val=`expr $a \* $b`
echo "a * b : $val"
例子
if [ $a == $b ] # [$a==$b] 是錯(cuò)誤的,必須寫成 [ $a == $b ]
then
echo "a 等于 b"
fi
總結(jié)如下:
- 乘號(hào)(*)前邊必須加反斜杠()才能實(shí)現(xiàn)乘法運(yùn)算泌类;
- 表達(dá)式和運(yùn)算符之間要有空格: 2+2 錯(cuò)癞谒, 2 + 2
- 完整的表達(dá)式要被 ` ` 包含。
(2) 關(guān)系運(yùn)算符: 只支持?jǐn)?shù)字刃榨,不支持字符串弹砚,
結(jié)果: true, false
判斷 :相等(-eq)枢希, 不相等(-ne)
大于(-gt)桌吃, 小于(-lt)
大于等于(-ge), 小于等于(-le)
例子:
a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b: a 不等于 b"
fi
- 關(guān)系表達(dá)式在[]中苞轿,且前后要留有空格茅诱。
(3) 布爾運(yùn)算符: 結(jié)果為 true, false搬卒。
與(-a) 或(-o) 瑟俭,非(!)
if [ $a -lt 100 -a $b -gt 15 ]
then
echo "$a 小于 100 且 $b 大于 15 : 返回 true"
else
echo "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
(4) 邏輯運(yùn)算符: 結(jié)果為 true契邀, false摆寄。
邏輯與(&&), 邏輯或(||) # 采用雙[[ ]] zz中括號(hào)
if [[ $a -lt 100 && $b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
(5) 字符串運(yùn)算符: 結(jié)果為 true蹂安, false。
判斷字符串: 相等(=)锐帜, 不相等(田盈!=)
長(zhǎng)度為0(-z) 長(zhǎng)度不為0(-n)
不為空($)
a="abc"
b="efg"
if [ $a = $b ] # 注: if [ $a ] 如果字符串為空
then
echo "$a = $b : a 等于 b"
else
echo "$a = $b: a 不等于 b"
fi
(6)文件測(cè)試運(yùn)算符: 檢查文件的屬性,返回:true缴阎, false
檢測(cè)文件:
是塊設(shè)備[ -b file ]允瞧, 是字符設(shè)備[ -c $file ]
是目錄[ -d $file ] , 是普通文件 [ -f $file ]
是有名管道[ -p $file ] ,
檢測(cè)文件權(quán)限:
是可讀 [ -r $file ] , 是可寫[ -w $file ]
是可執(zhí)行[ -x $file ] 蛮拔, 是為空[ -s $file ]
檢測(cè)文件(包括目錄):
是否存在[ -e $file ]
例子:
file="/var/test.sh"
if [ -e $file ]
then
echo "文件存在"
else
echo "文件不存在"
fi
例子:
expr 45/21 # 直接輸出
echo $[45 +21] #$[]格式述暂,需要echo輸出
- 使用隨機(jī)數(shù)(RANDOM 變量): echo $[RANDOM %100]
(7) 條件測(cè)試test 命令
注:測(cè)試操作的方法
測(cè)試的本質(zhì):是判斷一個(gè)條件的操作命令。 而$?返回值可以判斷條件是否成立建炫。
格式1: test 條件表達(dá)式
格式2: [條件表達(dá)式] 注: 主要使用這種方式
注: 練習(xí)可以使用的方式: 【條件表達(dá)式】&& echo YES
上面的結(jié)果是: 失敗什么都不輸出畦韭; 成功輸出YES。
作用:用于檢查某個(gè)條件是否成立肛跌,進(jìn)行數(shù)值艺配、字符和文件三個(gè)方面的測(cè)試察郁。
1)數(shù)值: 結(jié)果 true, flase
-eq 等于 -ne 不等于
-gt 大于 -ge 大于等于
-lt 小于 -le 小于等于
例子:
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '兩個(gè)數(shù)相等转唉!'
else
echo '兩個(gè)數(shù)不相等皮钠!'
fi
2)字符串 結(jié)果 true, flase
= 等于赠法, 麦轰!=不等于 -z 字符串(字符串長(zhǎng)度為0) -n 字符串 (長(zhǎng)度不為0)
num1="123"
num2="124"
if test $num1 = $num2
then
echo '兩個(gè)字符串相等!'
else
echo '兩個(gè)字符串不相等!'
fi
3) 文件測(cè)試 結(jié)果 true, flase
-e 文件名 : 文件存在
-r 文件名 : 文件存在且可讀
-w 文件名 : 文件存在且可寫
-x 文件名 : 文件存在且可執(zhí)行
-s 文件名 : 文件存在且至少有一個(gè)字符
-d 文件名 :文件存在且為目錄
-f 文件名 :文件存在且為普通文件
-c 文件名 :文件存在且為字符型特殊文件
-b 文件名 :文件存在且為塊特殊文件
if test -e ./SE
then
…
fi
3. 流程控制
(1)程序流控制
(2)單分支砖织、雙分支的if應(yīng)用
單分支
If 條件測(cè)試
then
命令序列
fi
雙分支
if 條件測(cè)試
then
命令序列1
else
命令序列2
fi
多分支
if 條件測(cè)試
then
命令序列1
elif 條件測(cè)試2
then
命令序列2
else
命令序列n
fi
(3)for循環(huán)
for 變量名 in 取值列表
do
命令序列
done
(4)while循環(huán)
while condition
do
command
done
無限循環(huán):
while true
do
command
done
或者: for (( ; ; ))
(5)與while相反的循環(huán)
until condition #直至條件為 true 時(shí)停止
do
command
done
(6)case語句款侵,多選擇
case 變量值 in
模式1)
命令序列1
;镶苞;
模式2)
命令序列2
喳坠;;
茂蚓。壕鹉。。聋涨。晾浴。
*)
默認(rèn)命令序列
esac
注:其中的模式1,模式2是不同的取值牍白,比如: 【a-z】 【0-9】
(7)break :跳出循環(huán)
continue : 退出當(dāng)前循環(huán)
6 函數(shù)
(1)格式:
function 函數(shù)名 () # function可選脊凰,即:可以沒有
{
動(dòng)作
return xx # return可選,即:可以沒有
}
(2)函數(shù)參數(shù): 函數(shù)體內(nèi)部茂腥, 用$n 的形式來獲取參數(shù)的值:
$1表示第一個(gè)參數(shù)狸涌,$2表示第二個(gè)參數(shù)
調(diào)用函數(shù)時(shí),函數(shù)名后面的為參數(shù)最岗。
注: 當(dāng)n>=10時(shí)帕胆,需要使用${n}來獲取參數(shù)
注:$0為執(zhí)行的文件名
(3) 處理參數(shù)的特殊字符:
$# :傳遞到腳本的參數(shù)個(gè)數(shù)
$* :以一個(gè)單字符串顯示所有向腳本傳遞的參數(shù)**
$$ :腳本運(yùn)行的當(dāng)前進(jìn)程ID號(hào)
$! :后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的ID號(hào)
$- :顯示Shell使用的當(dāng)前選項(xiàng)。
$? :顯示最后命令的退出狀態(tài)般渡。0表示沒有錯(cuò)誤懒豹,其他任何值表明有錯(cuò)誤。
7. shell 命令的組合應(yīng)用: 管道操作驯用, 重定向脸秽, 邏輯分割。
(1)重定向: 輸出重定向 與 輸入重定向**
輸出重定向—》 將命令的輸出結(jié)果 從終端 重定向到文件中蝴乔,可覆蓋记餐,可追加。
輸入重定向—》 從文件中讀取要執(zhí)行的命令(不是用戶輸入/dev/null 文件
command > file 將輸出重定向到 file薇正。 《覆蓋》
command < file 將輸入重定向到 file剥扣。
command >> file 將輸出以追加的方式重定向到 file巩剖。《追加》
n > file 將文件描述符為 n 的文件重定向到 file钠怯。
n >> file 將文件描述符為 n 的文件以追加的方式重定向到 file佳魔。
n >& m 將輸出文件 m 和 n 合并。
n <& m 將輸入文件 m 和 n 合并晦炊。
<< tag 將開始標(biāo)記 tag 和結(jié)束標(biāo)記 tag 之間的內(nèi)容作為輸入鞠鲜。
(2)管道: 將一端的命令輸出交給另一端的命令處理。 注: 兩端都是命令断国。
格式:命令1 | 命令2
作用:基本的統(tǒng)計(jì) 與 過濾贤姆。
注:管道的右側(cè)是:命令。 重定向的右側(cè)是:文件稳衬。
(3) 邏輯分割:處理多條“命令”間的邏輯關(guān)系霞捡。
邏輯與&& ---》 要求: 兩個(gè)命令都成功
邏輯或|| ---》要求: 兩個(gè)命令有一個(gè)成功就結(jié)束,不在執(zhí)行
順序執(zhí)行“薄疚;”即:分號(hào)
用途: 判斷命令是否執(zhí)行成功碧信。
例如: mkdir /ceshi/a 2>/dev/null && echo “成功”
或者:mkdir /ceshi/a 2>/dev/null || echo “失敗”
注: 即兩個(gè)命令一個(gè)執(zhí)行完,另一個(gè)才執(zhí)行街夭。
(4)回收站: /dev/null
/dev/null 是一個(gè)特殊的文件砰碴,寫入到它的內(nèi)容都會(huì)被丟棄;
如果希望屏蔽 stdout 和 stderr板丽,可以這樣寫: $ command > /dev/null 2>&1
注: 0 是標(biāo)準(zhǔn)輸入(STDIN)呈枉,1 是標(biāo)準(zhǔn)輸出(STDOUT),2 是標(biāo)準(zhǔn)錯(cuò)誤輸出(STDERR)埃碱。
3. 文件包含(腳本中 包含腳本文件)
方式1: . filename # 注意點(diǎn)號(hào)(.)和文件名中間有一空格
方式2: source filename
注: 被包含的腳本不需要可執(zhí)行權(quán)限猖辫, 只需要外面的腳本添加可執(zhí)行權(quán)限即可。
-
LINUX 啟動(dòng)五階段:
內(nèi)核的引導(dǎo)砚殿。 運(yùn)行 init啃憎。 系統(tǒng)初始化。 建立終端 瓮具。 用戶登錄系統(tǒng)荧飞。
(1)內(nèi)核引導(dǎo)
開電源凡人,BIOS開機(jī)自檢名党,按其設(shè)置的啟動(dòng)設(shè)備(硬盤/CF卡)來啟動(dòng)。
操作系統(tǒng)接管硬件以后挠轴,首先讀入 /boot 目錄下的內(nèi)核文件传睹。
(2)init 進(jìn)程: 系統(tǒng)所有進(jìn)程的起點(diǎn)(目的: 啟動(dòng)守護(hù)進(jìn)程)
init 程序首先是需要讀取配置文件 /etc/inittab。
運(yùn)行級(jí)別 : 啟動(dòng)時(shí)根據(jù)運(yùn)行級(jí)別岸晦,切丁運(yùn)行那些服務(wù)/守護(hù)進(jìn)程
init進(jìn)程的一大任務(wù)欧啤,就是去運(yùn)行開機(jī)啟動(dòng)的程序睛藻。Linux允許為不同的場(chǎng)合,分配不同的開機(jī)啟動(dòng)程序邢隧,這就叫做"運(yùn)行級(jí)別"店印。 7個(gè)級(jí)別略。
111.png
(3)系統(tǒng)初始化(目的: 通過腳本倒慧,配置系統(tǒng)環(huán)境)
init配置文件中有一行:si::sysinit:/etc/rc.d/rc.sysinit調(diào)用執(zhí)/etc/rc.d/rc.sysinit按摘,而rc.sysinit是一個(gè)bash shell的腳本,用于完成一些系統(tǒng)初始化工作纫谅。
腳本實(shí)現(xiàn):激活交換分區(qū)炫贤,檢查磁盤,加載硬件模塊以及其它一些需要優(yōu)先執(zhí)行任務(wù)付秕。
(4)建立終端
rc執(zhí)行完畢后兰珍,返回init。init會(huì)打開6個(gè)終端询吴,以便用戶登錄系統(tǒng)掠河。tty1-tty6。
(5)用戶登錄系統(tǒng)
用戶的登錄方式有三種: 命令行登錄 汰寓, ssh登錄 口柳, 圖形界面登錄。
關(guān)機(jī)介紹:
sync 將數(shù)據(jù)由內(nèi)存同步到硬盤中有滑。 #注:關(guān)機(jī)重啟之前是先自動(dòng)執(zhí)行該指令跃闹。
shutdown 關(guān)機(jī)指令,
shutdown –h 10 ‘This server will shutdown after 10 mins’
shutdown –h +10 # 十分鐘后關(guān)機(jī)
shutdown –h now #立馬關(guān)機(jī)
shutdown –h 20:25 #系統(tǒng)會(huì)在今天20:25關(guān)機(jī)
reboot #重啟
shutdown –r now #系統(tǒng)立馬重啟
shutdown –r +10 #系統(tǒng)十分鐘后重啟
擴(kuò)展:代換
1. 文件名代換:用于匹配的字符稱為通配符毛好,如:* ? [ ] 具體如下:
* 匹配0個(gè)或多個(gè)任意字符
? 匹配一個(gè)任意字符
[若干字符] 匹配方括號(hào)中任意一個(gè)字符的一次出現(xiàn)
2. 命令代換:由“`”反引號(hào)括起來的也是一條命令望艺,Shell先執(zhí)行該命令,然后將輸出結(jié)果立刻代換到當(dāng)前命令行中肌访。
例如定義一個(gè)變量存放date命令的輸出:
DATE=`date`
echo $DATE
命令代換也可以用$()表示: DATE=$(date)
3. 算術(shù)代換
使用$(())找默,用于算術(shù)計(jì)算,(())中的Shell變量取值將轉(zhuǎn)換成整數(shù)吼驶,同樣含義的$[ ]等價(jià)惩激。
例如:
VAR=45
echo $(($VAR+3)) 等價(jià)于 $((var+3)) 或echo $[VAR+3]或 $[$VAR+3]
$(())中 只能用+-*/和()運(yùn)算符,并且只能做整數(shù)運(yùn)算蟹演。
$[base#n]风钻,其中base表示進(jìn)制,n按照base進(jìn)制解釋酒请,后面再有運(yùn)算數(shù)骡技,按十進(jìn)制解釋。
echo $[2#10+11]
4. 轉(zhuǎn)義字符 \
用于去除緊跟其后的單個(gè)字符的特殊意義(回車除外),即: 緊跟其后的字符取字面值
echo $SHELL
結(jié)果: /bin/bash
echo \$SHELL
結(jié)果: $SHELL
5. 單引號(hào)雙引號(hào): 都是字符串的界定符布朦。
單引號(hào)用于保持引號(hào)內(nèi)所有字符的字面值囤萤,即使引號(hào)內(nèi)的\和回車也不例外,但是字符串中不能出現(xiàn)單引號(hào)是趴。
被雙引號(hào)用括住的內(nèi)容涛舍,將被視為單一字串。它防止通配符擴(kuò)展唆途,但允許變量擴(kuò)展做盅。
VAR=200
echo $VAR # 結(jié)果200
echo '$VAR' # 結(jié)果$VAR
echo "$VAR" # 結(jié)果200