Shell是一個(gè)"命令行解釋器",它為用戶提供了一個(gè)向Linux內(nèi)核發(fā)送請(qǐng)求以便運(yùn)行程
序的界面系統(tǒng)級(jí)程序,用戶可以用Shell來(lái)啟動(dòng)、掛起旺聚、停止甚至是編寫(xiě)一些程序乡数。
同時(shí)也是一個(gè)"功能相當(dāng)強(qiáng)大的編程語(yǔ)言",易編寫(xiě),易調(diào)試,靈活性較強(qiáng)色洞。Shell是解
釋執(zhí)行的腳本語(yǔ)言,在Shell中可以直接調(diào)用Linux系統(tǒng)命令贞言。
echo
echo輸出的內(nèi)容如果有空格則需要額外加上引號(hào)
感嘆號(hào)有特殊作用,加雙引號(hào)不能正確執(zhí)行糕篇,加但引號(hào)可以
echo [選項(xiàng)][輸出內(nèi)容]
-e
選項(xiàng)支持反斜線控制的字符轉(zhuǎn)換
控制字符 | 作用 |
---|---|
|輸出\本身 | |
\a | 輸出警告音 |
\b | 退格鍵 |
\c | 取消輸出行末的換行符啄育,和"-n"選項(xiàng)一致 |
\e | ESCAPE鍵 |
\f | 翻頁(yè) |
\n | 換行 |
\r | 回車(chē)鍵 |
\t | 制表符 |
\v | 垂直制表符 |
\0nnn | 按照八進(jìn)制ASCII碼表輸出字符。其中0為數(shù)字零,nnn是三位八進(jìn)制數(shù) |
\xhh | 按照十六進(jìn)制ASCII碼表輸出字符拌消。其中hh是兩位十六進(jìn)制數(shù) |
第一個(gè)腳本
#!/bin/Bash
#The first program
#Author: Alex (Email: Alex@example.com)
echo "hello world"
腳本執(zhí)行
- 賦予執(zhí)行權(quán)限挑豌,直接運(yùn)行
chmod 755 hello.sh
./hello.sh
- 通過(guò)bash調(diào)用執(zhí)行腳本
bash hello.sh
歷史命令與命令補(bǔ)全
歷史命令
history [選項(xiàng)] [歷史命令保存文件]
-c 清空歷史命令
-w 把緩存中的歷史命令寫(xiě)入歷史命令保存文件"~./bash_history"
注意:
- 歷史命令默認(rèn)會(huì)保存1000條,可以在環(huán)境變量配置文件
/ect/profile
中進(jìn)行修改 - 使用上下箭頭可以調(diào)用以前的歷史命名
- 使用"!n"重復(fù)執(zhí)行第"n"條命令
- 使用"!!"重復(fù)執(zhí)行上一條命令
- 使用"!字串"重復(fù)執(zhí)行最后一條以該字串開(kāi)頭的命令
命令補(bǔ)全
在Bash中,命令與文件補(bǔ)全是非常方便與常用的功能,我們只要在輸入命令或文件時(shí),按“Tab”鍵就會(huì)自動(dòng)進(jìn)行補(bǔ)全
命令別名"alias"
設(shè)定別名:alias 別名="原命令"
查詢別名:alias
命令執(zhí)行順序
- 第一順位執(zhí)行用"絕對(duì)路徑"或"相對(duì)路徑"執(zhí)行的命令。
- 第二順位執(zhí)行別名浮毯。
- 第三順位執(zhí)行Bash的內(nèi)部命令完疫。
- 第四順位執(zhí)行按照
$PATH
環(huán)境變量定義的目錄查找順序找到的第一個(gè)命令。
讓別名永久生效
可以寫(xiě)入到/home/username/.bashrc
中
理解.bashrc
,可查看linux環(huán)境變量
刪除別名
unalias 別名
Bash 常用快捷鍵
快捷鍵 | 作用 |
---|---|
ctrl+A | 把光標(biāo)移動(dòng)到命令行開(kāi)頭 |
ctrl+E | 把光標(biāo)移動(dòng)到命令行結(jié)尾 |
ctrl+C | 強(qiáng)制終止當(dāng)前的命令 |
ctrl+L | 清屏,相當(dāng)于clear 命令 |
ctrl+U | 刪除或剪切光標(biāo)之前的命令 |
ctrl+K | 刪除或剪切光標(biāo)之后的內(nèi)容 |
ctrl+Y | 粘貼ctrl+U或ctrl+K剪切的內(nèi)容 |
ctrl+R | 在歷史命令中搜索,按下ctrl+R之后,就會(huì)出現(xiàn)搜索界面,只要輸入搜索內(nèi)容,就會(huì)從歷史命令中搜索 |
ctrl+D | 退出當(dāng)前終端 |
ctrl+Z | 暫停,并放入后臺(tái) |
ctrl+S | 暫停屏幕輸出 |
ctrl+Q | 恢復(fù)屏幕輸出 |
輸入輸出重定向
標(biāo)準(zhǔn)輸入輸出
設(shè)備 | 設(shè)備文件名 | 文件描述符 | 類(lèi)型 |
---|---|---|---|
鍵盤(pán) | /dev/stdin |
0 | 標(biāo)準(zhǔn)輸入 |
顯示器 | /dev/sdtout |
1 | 標(biāo)準(zhǔn)輸出 |
顯示器 | /dev/sdterr |
2 | 標(biāo)準(zhǔn)錯(cuò)誤輸出 |
輸出重定向
標(biāo)準(zhǔn)輸出重定向
符號(hào) | 作用 |
---|---|
命令 > 文件 |
以覆蓋的方式,把命令的正確輸出輸出到指定的文件或設(shè)備當(dāng)中 |
命令 >> 文件 |
以追加的方式,把命令的正確輸出輸出到指定的文件或設(shè)備當(dāng)中 |
標(biāo)準(zhǔn)錯(cuò)誤輸出重定向
符號(hào) | 作用 |
---|---|
錯(cuò)誤命令 2> 文件 |
以覆蓋的方式,把命令的錯(cuò)誤輸出輸出到指定的文件或設(shè)備當(dāng)中 |
錯(cuò)誤命令 2>> 文件 |
以追加的方式,把命令的錯(cuò)誤輸出輸出到指定的文件或設(shè)備當(dāng)中 |
正確輸出和錯(cuò)誤輸出同時(shí)保存
符號(hào) | 作用 |
---|---|
命令 > 文件 2>&1 |
以覆蓋的方式,把正確輸出和錯(cuò)誤輸出都保存到同一個(gè)文件中去 |
命令 >> 文件 2>&1 |
以追加的方式,把正確輸出和錯(cuò)誤輸出都保存到同一個(gè)文件中去 |
命令 &> 文件 |
以覆蓋的方式,把正確輸出和錯(cuò)誤輸出都保存到同一個(gè)文件中去 |
命令 &>> 文件 |
以追加的方式,把正確輸出和錯(cuò)誤輸出都保存到同一個(gè)文件中去 |
命令 >> 文件1 2>>文件2 |
把正確輸出追加到"文件1"中债蓝,把錯(cuò)誤輸出追加到"文件2"中 |
注意:"2"等符號(hào)之間沒(méi)有空格壳鹤,命令文件等與符號(hào)之間可以有空格
輸入重定向
- 把文件作為命令的輸入
命令 < 文件
- 把標(biāo)識(shí)符之間內(nèi)容作為命令的輸入
命令 << 標(biāo)識(shí)符
...
標(biāo)識(shí)符
舉例:
wc [選項(xiàng)] [文件名]
-c 統(tǒng)計(jì)字節(jié)數(shù)
-w 統(tǒng)計(jì)單詞數(shù)
-l 統(tǒng)計(jì)行數(shù)
多命令的順序執(zhí)行
多命令順序執(zhí)行
多命令執(zhí)行符 | 格式 | 作用 |
---|---|---|
; |
命令1; 命令2 |
多個(gè)命令順序執(zhí)行,命令之間沒(méi)有任何邏輯聯(lián)系 |
&& |
命令1&& 命令2 |
邏輯與:1執(zhí)行饰迹,2才會(huì)執(zhí)行芳誓;1執(zhí)行不正確,2不會(huì)執(zhí)行 |
|| |
命令1|| 命令2 |
邏輯或:1執(zhí)行啊鸭,2不會(huì)執(zhí)行锹淌;1執(zhí)行不正確,2執(zhí)行 |
管道符
命令1作為命令2的操作對(duì)象
命令1|命令2
例如:cat file|pager
分頁(yè)顯示
grep搜索
grep [選項(xiàng)] "搜索內(nèi)容" 文件名
-i: 忽略大小寫(xiě)
-n: 輸出行號(hào)
-v: 反向查找
--color=auto 搜索出的關(guān)鍵字用顏色顯示
通配符與其他符號(hào)
通配符
通配符 | 作用 |
---|---|
? | 匹配任意一個(gè)字符 |
* | 匹配0個(gè)或任意多個(gè)字符赠制,也就是任意內(nèi)容 |
[ ] | 匹配中括號(hào)中任意一個(gè)字符赂摆,例如:[ab]就是匹配a或b |
[-] | 匹配中括號(hào)中一個(gè)字符,例如:[a-c]就是匹配a钟些,或b烟号,或c |
[^] | 邏輯"非"匹配不是括號(hào)中的一個(gè)字符 |
bash中的其他符號(hào)
符號(hào) | 作用 |
---|---|
'' | 單引號(hào):在單引號(hào)中所有的特殊符號(hào),如“$”和“`”(反引號(hào))都沒(méi)有特殊含義。 |
"" | 雙引號(hào):在雙引號(hào)中特殊符號(hào)都沒(méi)有特殊含義,但是“$”政恍、“`”和“\”是例外,擁有“調(diào)用變量的值”汪拥、“引用命令”和“轉(zhuǎn)義符”的特殊含義。 |
`` | 反引號(hào):反引號(hào)括起來(lái)的內(nèi)容是系統(tǒng)命令,在Bash中會(huì)先執(zhí)行它篙耗。和$()作用一樣,不過(guò)推薦使用$(),因?yàn)榉匆?hào)非常容易看錯(cuò)迫筑。 |
$() | 和反引號(hào)作用一樣,用來(lái)引用系統(tǒng)命令。 |
# | 在Shell腳本中,#開(kāi)頭的行代表注釋宗弯。 |
$ | 用于調(diào)用變量的值,如需要調(diào)用變量name的值時(shí),需要用$name 的方式得到變量的值脯燃。 |
\ |
轉(zhuǎn)義符:跟在\ 之后的特殊符號(hào)將失去特殊含義,變?yōu)槠胀ㄗ址H?將輸出“$”符號(hào),而不當(dāng)做是變量引用罕伯。 |
例子:
$ echo "date"
date
$ echo "$(date)"
Mon Jul 31 14:52:54 CST 2017
$ greet="hello linux"
$ echo greet
greet
$ echo $greet
hello linux
用戶自定義變量
變量
變量是計(jì)算機(jī)內(nèi)存的單元,其中存放的值可以改變曲伊。當(dāng)Shell腳本需要保存一些信息時(shí),如一個(gè)文件名或是一個(gè)數(shù)字,就把它存放在一個(gè)變量中。每個(gè)變量有一個(gè)名字,所以很容易引用它追他。使用變量可以保存有用信息,使系統(tǒng)獲知用戶相關(guān)設(shè)置,變量也可以用于保存暫時(shí)信息。
變量設(shè)置規(guī)則
- 變量名稱(chēng)可以由字母岛蚤、數(shù)字和下劃線組成,但是不能以數(shù)字開(kāi)頭邑狸。如果變量名是“2name”則是錯(cuò)誤的
- 在Bash中,變量的默認(rèn)類(lèi)型都是字符串型,如果要進(jìn)行數(shù)值運(yùn)算,則必須指定變量類(lèi)型為數(shù)值型。
- 變量用等號(hào)連接值,等號(hào)左右兩側(cè)不能有空格涤妒。
- 變量的值如果有空格,需要使用單引號(hào)或雙引號(hào)包括单雾。
- 在變量的值中,可以使用“\”轉(zhuǎn)義符。
- 如果需要增加變量的值,那么可以進(jìn)行變量值的疊加。不過(guò)變量需要用雙引號(hào)包含“$變量名”或用${變量名}包含硅堆。
- 如果是把命令的結(jié)果作為變量值賦予變量,則需要使用反引號(hào)或$()包含命令屿储。
- 環(huán)境變量名建議大寫(xiě),便于區(qū)分。
變量分類(lèi)
- 用戶自定義變量
- 環(huán)境變量:這種變量中主要保存的是和系統(tǒng)操作環(huán)境相關(guān)的數(shù)據(jù)渐逃。
- 位置參數(shù)變量:這種變量主要是用來(lái)向腳本當(dāng)中傳遞參數(shù)或數(shù)據(jù)的,變量名不能自定義,變量作用是固定的够掠。
- 預(yù)定義變量:是Bash中已經(jīng)定義好的變量,變量名不能自定義,變量作用也是固定的。
本地變量(用戶自定義變量)
變量定義
$ name="alex zhang"
變量疊加
$ aa=123
$ aa="$aa"456
$ aa=${aa}789
變量調(diào)用
$ echo $name
變量查看
$ set
變量刪除
$ unset name
環(huán)境變量
用戶自定義變量只在當(dāng)前的Shell中生效,而環(huán)境變量會(huì)在當(dāng)前Shell和這個(gè)Shell的所有子Shell當(dāng)中生效茄菊。如果把環(huán)境變量寫(xiě)入相應(yīng)的配置文件,那么這個(gè)環(huán)境變量就會(huì)在所有的Shell中生效疯潭。
設(shè)置環(huán)境變量
一個(gè)變量創(chuàng)建時(shí),它不會(huì)自動(dòng)地為在它之后創(chuàng)建的shell進(jìn)程所知面殖。而命令export可以向后面的shell傳遞變量的值竖哩。當(dāng)一個(gè)shell腳本調(diào)用并執(zhí)行時(shí),它不會(huì)自動(dòng)得到原為腳本(調(diào)用者)里定義的變量的訪問(wèn)權(quán)脊僚,除非這些變量已經(jīng)被顯式地設(shè)置為可用相叁。export命令可以用于傳遞一個(gè)或多個(gè)變量的值到任何后繼腳本。export將變量申明為全局變量
- 申明變量:
export 變量名=變量值
或者export 本地變量名
辽幌,申明該本地變量為環(huán)境變量 - 查詢變量:
env
- 刪除變量:
unset 變量名
系統(tǒng)常見(jiàn)環(huán)境變量
PATH:系統(tǒng)查找命令的路徑
PATH變量疊加:PATH="$PATH":/username/project
三種修改環(huán)境變量的方式:
-
PATH="$PATH":/username/project
直接疊加環(huán)境變量钝荡,臨時(shí)有效 -
vi /etc/profile
在適當(dāng)位置添加PATH="$PATH":/username/project
,所有用戶有效 -
vi ~/.bash_profile
修改PATH行舶衬,添加PATH="$PATH":/username/project
埠通,當(dāng)前用戶有效
注意:
將/username/project
添加到環(huán)境變量,該目錄下的腳本文件可以直接執(zhí)行逛犹,而不再需要”絕對(duì)路徑“或”相對(duì)路徑“端辱,比如正常需要執(zhí)行腳本文件”hello.sh“需要chmod 755 hello.sh
然后./hello.sh
或/username/project/hello.sh
才能執(zhí)行,這時(shí)只需hello.sh
就可直接執(zhí)行
PS1
定義系統(tǒng)提示符的變量
\d:顯示日期,格式為“星期 月 日”
\h:顯示簡(jiǎn)寫(xiě)主機(jī)名虽画。如默認(rèn)主機(jī)名“l(fā)ocalhost”
\t:顯示24小時(shí)制時(shí)間,格式為“HH:MM:SS”
\T:顯示12小時(shí)制時(shí)間,格式為“HH:MM:SS”
\A:顯示24小時(shí)制時(shí)間,格式為“HH:MM”
\u:顯示當(dāng)前用戶名
\w:顯示當(dāng)前所在目錄的完整名稱(chēng)
\W:顯示當(dāng)前所在目錄的最后一個(gè)目錄
\#:執(zhí)行的第幾個(gè)命令
\$:提示符舞蔽。如果是root用戶會(huì)顯示提示符為“#”,如果是普通用戶
會(huì)顯示提示符為“$”
例子:
alex@alex-zh ~ $ PS1='[\u@\t \w]\$ '
[alex@16:14:28 ~]$ PS1='[\u@\t \#\w]\$ '
[alex@16:14:59 20~]$ PS1='\u@\H \w \$ '
alex@alex-zh ~ $
位置參數(shù)變量
位置參數(shù) | 作用 |
---|---|
$n | n為數(shù)字,$0代表命令本身,$1-$9代表第一到第九個(gè)參數(shù),十以上的參數(shù)需要用大括號(hào)包含,如${10} |
$* | 這個(gè)變量代表命令行中所有的參數(shù),$*把所有的參數(shù)看成一個(gè)整體 |
$@ | 這個(gè)變量也代表命令行中所有的參數(shù),不過(guò)$@把每個(gè)參數(shù)區(qū)分對(duì)待 |
$# | 這個(gè)變量代表命令行中所有參數(shù)的個(gè)數(shù) |
例子:
#!/bin/bash
#
num1=$1
num2=$2
sum=$(($num1+$num2))
echo $sum
$*
與$@
區(qū)別
$*
中的所有參數(shù)看成是一個(gè)整體,所以這個(gè) for 循環(huán)只會(huì)循環(huán)一次
$@
中的每個(gè)參數(shù)都看成是獨(dú)立的,所以“ $@ ”中有幾個(gè)參數(shù),就會(huì)循環(huán)幾次
Bash運(yùn)算符
數(shù)值運(yùn)算與運(yùn)算符
linux Shell中,所有變量默認(rèn)為字符串
declare聲明變量類(lèi)型
declare [+/-][選項(xiàng)]變量名
選項(xiàng) | 變量 |
---|---|
- | 給變量設(shè)定類(lèi)型屬性 |
+ | 給變量取消類(lèi)型屬性 |
-i | 將變量聲明為整數(shù)型 |
-x | 將變量聲明為環(huán)境變量 |
-p | 顯示指定變量的被聲明類(lèi)型 |
選項(xiàng):
選項(xiàng) | 變量 |
---|---|
- | 給變量設(shè)定類(lèi)型屬性 |
+ | 給變量取消類(lèi)型屬性 |
-i | 將變量聲明為整數(shù)型 |
-x | 將變量聲明為環(huán)境變量 |
-p | 顯示指定變量的被聲明類(lèi)型 |
數(shù)值運(yùn)算
- 方法1
$ aa=11
$ bb=22
$ declare -i cc=$aa+$bb # 聲明為整數(shù)型
- 方法2:expr或let數(shù)值運(yùn)算工具
$ aa=11
$ bb=22
$ dd=$(expr $aa + $ bb) # dd是aa和bb值的和码撰,“+”號(hào)左右有空格
- 方法3:$((運(yùn)算式))或$[運(yùn)算式]
$ aa=11
$ bb=22
$ ee=$(($aa+$bb))
$ ff=$[$aa+$bb]
運(yùn)算符
優(yōu)先級(jí) | 運(yùn)算符 | 說(shuō)明 |
---|---|---|
13 | -, + | 單目負(fù)渗柿、單目正 |
12 | !, ~ | 邏輯非、按位取反或補(bǔ)碼 |
11 | *, /, % | 乘除取模 |
10 | +, - | 加脖岛,減 |
9 | <<, >> | 按位左移朵栖、按位右移 |
8 | < =, > =, <, > | 小于或等于、大于或等于柴梆、小于陨溅、大于 |
7 | ==, != | 等于、不等于 |
6 | &按位與 | |
5 | ^ | 按位異或 |
4 | | | 按位或 |
3 | && | 邏輯與 |
2 | || | 邏輯或 |
1 | +, =, -=, *=, /=, %=, &=, ^=, |=, <<=, >>= | 賦值绍在、運(yùn)算且賦值 |
變量測(cè)試與內(nèi)容替換
變量置換方式 | 變量y沒(méi)有設(shè)置 | 變量y為空值 | 變量y設(shè)置值 |
---|---|---|---|
x=${y-新值} | x=新值 | x為空 | x=$y |
x=${y:-新值} | x=新值 | x=新值 | x=$y |
x=${y+新值} | x為空 | x=新值 | x=新值 |
x=${y:+新值} | x為空 | x為空 | x=新值 |
x=${y=新值} | x=新值队询;y=新值 | x為空;y值不變 | x=$y为黎;y值不變 |
x=${y:=新值} | x=新值;y=新值 | x=新值y=新值 | x=$y霸奕;y值不變 |
x=${y?新值} | 新值輸出到標(biāo)準(zhǔn)錯(cuò)誤輸出(就是屏幕) | x為空 | x=$y |
x=${y:?新值} | 新值輸出到標(biāo)準(zhǔn)錯(cuò)誤輸出 | 新值輸出到標(biāo)準(zhǔn)錯(cuò)誤輸出 | x=$y |
環(huán)境變量配置文件
環(huán)境變量會(huì)在一系列shell中有效,本地變量在本shell窗口有效吉拳。環(huán)境變量比本地變量適用范圍多一些质帅,修改環(huán)境變量文件永久性的更改環(huán)境變量
source命令
修改了配置文件,需要退出再重新登陸才能生效合武。而source或者“.”避免了這個(gè)過(guò)程
用法1:source 配置文件
用法2:. 配置文件
- /etc/profile
- 作用:USER變量临梗,LOGNAME變量,MAIL變量稼跳,PATH變量盟庞,HOSTNAME變量,umask
- 調(diào)用/etc/profile.d/*.sh
- /etc/profile.d/*.sh
- 所有".sh"結(jié)尾的文件
- ~/.bash_profile
- home目錄汤善,對(duì)當(dāng)前用戶有效
- 調(diào)用~/.bashrc
- 在PATH變量后面加入了
:$home/bin
這個(gè)目錄
- ~/.bashrc
- home目錄什猖,當(dāng)前用戶有效
- 定義默認(rèn)別名
- 調(diào)用
/etc/bashrc
- /etc/bashrc
- PS1 變量
- umask
- PATH變量
- 調(diào)用
/etc/profile.d/*.sh