Shell基礎(chǔ)
Shell概述
1弧械、Shell是什么
Shell是一個(gè)命令行解釋器邮破,它為用戶提供了一個(gè)向Linux內(nèi)核發(fā)送請求以便運(yùn)行程序的界面系統(tǒng)級程序陨溅,用戶可以用Shell來啟動(dòng)院仿、掛起芯急、停止甚至是編寫一些程序失驶。
Shell還是一個(gè)功能相當(dāng)強(qiáng)大的編程語言土居,易編寫,易調(diào)試嬉探,靈活性較強(qiáng)擦耀。Shell是解釋執(zhí)行的腳本語言,在Shell中可以直接調(diào)用Linux系統(tǒng)命令涩堤。
2眷蜓、Shell的分類
Bourne Shell:從1979年起Unix就開始使用Bourne Shell,Bourne Shell 的主文件名為sh
C Shell:C Shell主要在BSD版的Unix系統(tǒng)中使用胎围,其語法和C語言相類似而得名
Shell的兩種主要語法類型有Bourne和C吁系,這兩種語法批次不兼容。Bourne家族主要包括sh白魂、ksh汽纤、Bash、psh福荸、zsh蕴坪;C家族主要包括:csh、tcsh
Bash:Bash與sh兼容,現(xiàn)在使用的Linux就是使用Bash作為用戶的基本Shell
3背传、Linux支持的Shell
/etc/shells
Shell腳本的執(zhí)行方式
1呆瞻、echo輸出命令
echo 【選項(xiàng)】【輸出內(nèi)容】
選項(xiàng):
-e : 支持反斜線控制的字符轉(zhuǎn)換。
控制字符 | 作用 |
---|---|
\ | 輸出\本身 |
\a | 輸出警告音 |
\b | 退格鍵径玖,也就是向左刪除鍵 |
\c | 取消輸出行末的換行符痴脾。和“-n”選項(xiàng)一致 |
\e | ESCAPE鍵 |
\f | 換頁符 |
\n | 換行符 |
\r | 回車鍵 |
\t | 制表符,也就是Tab鍵 |
\v | 垂直制表符 |
\0nnn | 按照八進(jìn)制ASCII碼表輸出字符挺狰。其中0為數(shù)字零明郭,nnn是三位八進(jìn)制數(shù) |
\xhh | 按照十六進(jìn)制ASCII碼表輸出字符。其中hh是兩位十六進(jìn)制數(shù) |
echo -e "ab\bc"
#刪除左側(cè)字符
echo -e "a\tb\tc\nd\te\tf"
#制表符與換行符
echo -e "\x61\t\x62\t\x63\n\x64\t\x65\t\x66"
#按照十六進(jìn)制ASCII碼也同樣可以輸出
echo -e "\e[1;31m abcd\e[0m"
#輸出顏色
#30m=黑色丰泊,31m=紅色薯定,32m=綠色,33m=黃色
#34m=藍(lán)色瞳购,35m=洋紅话侄,36m=1青色,37m=白色
2学赛、第一個(gè)腳本
vi hello.sh
#!/bin/bash
#The first program
\ #Author:wangwei (E-mail:mr_wangwei@hotmail.com)
echo -e "Mr.Wang Wei is the most honest man in China"
3年堆、腳本執(zhí)行
賦予執(zhí)行權(quán)限,直接運(yùn)行
chmod 755 hello.sh
./hello.sh
通過bash調(diào)用執(zhí)行腳本
bash hello.sh
Bash的基本功能
歷史命令與命令補(bǔ)全
1盏浇、歷史命令
history 【選項(xiàng)】【歷史命令保存文件】
選項(xiàng):
-c:清空歷史命令
-w:把緩存中的歷史命令寫入歷史命令保存文件~/.bash_history
歷史命令默認(rèn)會(huì)保存1000條变丧,可以在環(huán)境變量配置文件/etc/profile中進(jìn)行修改
歷史命令的調(diào)用
使用上、下箭頭調(diào)用以前的歷史命令
使用“!n"重復(fù)執(zhí)行第n條歷史命令
使用”!!“重復(fù)執(zhí)行上一條命令
使用”!字串“重復(fù)執(zhí)行最后一條以該字串開頭的命令
2绢掰、命令與文件補(bǔ)全
在Bash中痒蓬,命令與文件補(bǔ)全是非常方便與常用的功能,我們只要在輸入命令或文件時(shí)滴劲,按”Tab“鍵就會(huì)自動(dòng)進(jìn)行補(bǔ)全
命令別名與常用快捷鍵
1攻晒、命令別名
alias 別名=‘原命令’
#設(shè)定命令別名,臨時(shí)生效班挖,系統(tǒng)重啟后失效
alias
#查詢命令別名
命令執(zhí)行時(shí)順序
1.第一順位執(zhí)行用絕對路徑或相對路徑執(zhí)行的命令鲁捏。
2.第二順位執(zhí)行別名
3.第三順位執(zhí)行bash的內(nèi)部命令
4.第四順位執(zhí)行按照$PATH環(huán)境變量定義的目錄查找順序找到的第一個(gè)命令
讓別名永久生效
vi /root/.bashrc
2、Bash常用快捷鍵
快捷鍵 | 作用 |
---|---|
ctrl + A | 把光標(biāo)移動(dòng)到命令行開頭萧芙。如果我們輸入的命令過長给梅,想要把光標(biāo)移動(dòng)到命令行開頭時(shí)使用 |
ctrl + E | 把光標(biāo)移動(dòng)到命令行結(jié)尾 |
ctrl + C | 強(qiáng)制終止當(dāng)前命令 |
ctrl + L | 清屏,相當(dāng)于clear命令 |
ctrl + U | 刪除或剪切光標(biāo)之前的命令双揪。我輸入了一行很長的命令破喻,不用使用退格鍵一個(gè)一個(gè)字符刪除,使用這個(gè)快捷鍵會(huì)更加方便 |
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 | 暫停羽德,并放入后臺。這個(gè)快捷鍵牽扯工作管理的內(nèi)容迅办,我們在系統(tǒng)管理章節(jié)詳細(xì)介紹 |
ctrl + S | 暫停屏幕輸出 |
ctrl + Q | 恢復(fù)屏幕輸出 |
輸入輸出重定向
1宅静、標(biāo)準(zhǔn)輸入輸出
設(shè)備 | 設(shè)備文件名 | 文件描述符 | 類型 |
---|---|---|---|
鍵盤 | /dev/stdin | 0 | 標(biāo)準(zhǔn)輸入 |
顯示器 | /dev/stdout | 1 | 標(biāo)準(zhǔn)輸出 |
顯示器 | /dev/stderr | 2 | 標(biāo)準(zhǔn)錯(cuò)誤輸出 |
2、輸出重定向
ls &>/dev/null 把輸出丟進(jìn)垃圾箱文件\
3站欺、輸入重定向
wc 【選項(xiàng)】【文件名】
#輸入wc后再輸入字符姨夹,可統(tǒng)計(jì)【行數(shù)、單詞數(shù)矾策、字符數(shù)(包含回車符)】
wc < 【文件名】
#跟文件名會(huì)統(tǒng)計(jì)文件中的三個(gè)數(shù)
選項(xiàng) | 功能 |
---|---|
-c | 統(tǒng)計(jì)字節(jié)數(shù) |
-w | 統(tǒng)計(jì)單詞數(shù) |
-l | 統(tǒng)計(jì)行數(shù) |
多命令順序執(zhí)行與管道符
1磷账、多命令順序執(zhí)行
多命令執(zhí)行符 | 格式 | 作用 |
---|---|---|
; | 命令1;命令2 | 多個(gè)命令順序執(zhí)行,命令之間沒有任何邏輯聯(lián)系 |
&& | 命令1&&命令2 | 邏輯與贾虽,當(dāng)命令1正確執(zhí)行逃糟,則命令2才會(huì)執(zhí)行,當(dāng)命令1執(zhí)行不正確蓬豁,則命令2不會(huì)執(zhí)行 |
|| | 命令1||命令2 | 邏輯或绰咽,當(dāng)命令1執(zhí)行不正確,則命令2才會(huì)執(zhí)行地粪,當(dāng)命令1正確執(zhí)行取募,則命令2不會(huì)執(zhí)行 |
dd命令,用指定大小的塊拷貝一個(gè)文件蟆技,并在拷貝的同時(shí)進(jìn)行指定的轉(zhuǎn)換
dd if=輸入文件 of=輸出文件 bs=字節(jié)數(shù) count=個(gè)數(shù)
選項(xiàng):
if=輸入文件 指定源文件或源設(shè)備
of=輸出文件 指定目標(biāo)文件或目標(biāo)設(shè)備
bs=字節(jié)數(shù) 指定一次輸入/輸出多少字節(jié)玩敏,即把這些字節(jié)看做一個(gè)數(shù)據(jù)塊
count=個(gè)數(shù) 指定輸入/輸出多少個(gè)數(shù)據(jù)塊
exp:
date ; dd if=/dev/zero of=/root/testfile bs=1k count=100000 ; date
#將100M的0文件寫入testfile,并且查看寫入時(shí)間
ls anaconda-ks.cfg && echo yes
ls /root/test || echo no
命令 && echo yes || echo no
# 如果正確執(zhí)行就輸出yes付魔,不正確執(zhí)行就輸出no
2聊品、管道符
命令格式:
命令1 | 命令2
#命令1的正確輸出作為命令2的操作對象
ll -a /etc/ | more
#將etc目錄下的文件列表分屏顯示
netstat -an | grep "ESTABLISHED"
#將網(wǎng)絡(luò)狀態(tài)列表中的已連接項(xiàng)篩選出來
grep 【選項(xiàng)】“搜索內(nèi)容” 文件名
選項(xiàng):
-i : 忽略大小寫
-n : 輸出行號
-v : 反向查找
--color=auto 搜索出的關(guān)鍵字用顏色顯示
通配符與其他特殊符號
1、通配符
通配符 | 作用 |
---|---|
? | 匹配一個(gè)任意字符 |
* | 匹配0個(gè)或任意多個(gè)任意字符几苍,也就是可以匹配任何內(nèi)容 |
[] | 匹配中括號中任意一個(gè)字符翻屈。例如:[abc]代表一定匹配一個(gè)字符,或者是a妻坝,或者是b伸眶,或者是c |
[-] | 匹配中括號中任意一個(gè)字符,-代表一個(gè)范圍刽宪。例如:[a-z]代表匹配一個(gè)小寫字母 |
[^] | 邏輯非厘贼,表示匹配不是中括號內(nèi)的一個(gè)字符。例如:【^0-9】代表匹配一個(gè)不是數(shù)字的字符 |
2圣拄、Bash中其他特殊符號
符號 | 作用 |
---|---|
‘ ’ | 單引號嘴秸。在單引號中所有的特殊符號,如“S”和“`”反引號都沒有特殊含義 |
“ ” | 雙引號。在雙引號中特殊符號都沒有特殊含義岳掐,但是“S”凭疮、“`”、“\”是例外串述,擁有“調(diào)用變量的值”执解、“引用命令”和轉(zhuǎn)義符“”的特殊含義 |
`` | 反引號。反引號括起來的內(nèi)容是系統(tǒng)命令纲酗,在Bash中會(huì)先執(zhí)行它衰腌。和 |
$() | 和反引號的作用一樣右蕊,用來引用系統(tǒng)命令 |
# | 在shell腳本中,#開頭的行代表注釋茉兰。 |
$ | 用于變量的值尤泽,如果需要調(diào)用變量name的值時(shí),需要用$name的方式得到變量的值规脸。 |
\ | 轉(zhuǎn)義符坯约,跟在\之后的特殊符號將失去特殊含義,變?yōu)槠胀ㄗ址肌H?將輸出“$”符號闹丐,而不當(dāng)做是變量引用。 |
Bash變量
用戶自定義變量
1被因、什么是變量
變量是計(jì)算機(jī)內(nèi)存的單元卿拴,其中存放的值可以改變。
2梨与、變量設(shè)置規(guī)則
變量名稱可以由字母堕花、數(shù)字好人下劃線組成,但是不能以數(shù)字開頭粥鞋。如果變量名稱是“2name”則是錯(cuò)誤的缘挽。
在Bash中,變量的默認(rèn)類型都是字符串型呻粹,如果要進(jìn)行數(shù)值運(yùn)算壕曼,則必須指定變量類型為數(shù)值型。
變量的值如果有空格等浊,需要使用單引號或雙引號包括腮郊。
在變量的值中,可以使用“\”轉(zhuǎn)義符筹燕。
如果需要增加變量的值轧飞,那么可以進(jìn)行變量值的疊加衅鹿。不過變量需要用雙引號包含“{變量名}包含
如果是把命令的結(jié)果作為變量值賦予變量,則需要使用反引號或$()包含命令过咬。
環(huán)境變量名建議大寫塘安,便于區(qū)分。
3援奢、變量分類
用戶自定義變量
環(huán)境變量:這種變量中主要保存的是和操作系統(tǒng)環(huán)境相關(guān)的數(shù)據(jù)。
位置參數(shù)變量:這種變量主要是用來向腳本當(dāng)中傳遞參數(shù)或數(shù)據(jù)的忍捡,變量名不能自定義集漾,變量作用是固定的。
預(yù)定義變量:是Bash中已經(jīng)定義好的變量砸脊,變量名不能自定義具篇,變量作用也是固定的。
4凌埂、本地變量(用戶自定義變量)
變量定義
name=“shenchao”
變量疊加
aa=123
aa="$aa"456
aa=${aa}789
變量調(diào)用
echo $name
變量查看
set
變量刪除
unset name
環(huán)境變量
1驱显、環(huán)境變量是什么
用戶自定義變量只在當(dāng)前的Shell中生效,而環(huán)境變量會(huì)在當(dāng)前Shell和這個(gè)Shell的所有子Shell的所有子Shell當(dāng)中生效瞳抓。如果把環(huán)境變量寫入相應(yīng)的配置文件埃疫,那么這個(gè)環(huán)境變量就會(huì)在所有的Shell中生效
2、設(shè)置環(huán)境變量
export 變量名=變量值
#申明變量
env
#查詢變量
unset 變量名
#刪除變量
3孩哑、系統(tǒng)常見環(huán)境變量
PATH:系統(tǒng)查找命令路徑
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
PATH="$PATH":/root/sh
#PATH變量疊加
PS1:定義系統(tǒng)提示符的變量
\d: 顯示日期栓霜,格式為“星期 月 日”
\h: 顯示簡寫主機(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)前所在目錄的完整名稱
\W: 顯示當(dāng)前所在目錄的最后一個(gè)目錄
#: 執(zhí)行的第幾個(gè)命令
”
例如:
PS1='[\u@t \w]$'
PS1='[\u@@ \h # \w]$'
PS1='[\u@\h \W]$'
位置參數(shù)變量
位置參數(shù)變量 | 作用 |
---|---|
$n | n為數(shù)字,¥0代表命令本身澎蛛, |
$* | 這個(gè)變量代表命令行中所有的參數(shù)瓶竭,$*把所有的參數(shù)看成一個(gè)整體 |
$@ | 這個(gè)變量也代表命令行中所有的參數(shù)督勺,不過$@把每個(gè)參數(shù)區(qū)分對待 |
$# | 這個(gè)變量代表命令行中所有的參數(shù)個(gè)數(shù) |
例子:
@的區(qū)別
#!/bin/bash
for i in "$*"
#i"
done
x=1
for y in "$@"
#$@中每個(gè)參數(shù)都看成是獨(dú)立的斤贰,所以“$@”中有幾個(gè)參數(shù)智哀,就會(huì)循環(huán)幾次
do ?
echo "The parametersy" ?
x=$(($x+1))
done
預(yù)定義變量
預(yù)定義變量 | 作用 |
---|---|
$? | 最后一次執(zhí)行的命令的返回狀態(tài)。如果這個(gè)變量的值為0荧恍,證明上一個(gè)命令正確執(zhí)行; 如果這個(gè)變量的值為非0(具體是哪個(gè)數(shù)瓷叫,由命令自己來決定)屯吊,則證明上一個(gè)命令執(zhí)行不正確了 |
$ | 當(dāng)前進(jìn)程的進(jìn)程號(PID) |
$! | 后臺運(yùn)行的最后一個(gè)進(jìn)程的進(jìn)程號(PID) |
#!/bin/bash
#Author:wangwei(E-mail:mr_wangwei@hotmail.com)echo "The current process is $$"
#輸出當(dāng)前進(jìn)程的PID
#這個(gè)PID就是variable.sh這個(gè)腳本執(zhí)行時(shí),生成的進(jìn)程的PIDfind /root -name hello.sh &
#使用find命令在root目錄下查找hello.sh文件
#符號&的意思是把命令放入后臺執(zhí)行摹菠,工作管理我們在系統(tǒng)管理章節(jié)會(huì)詳細(xì)介紹
echo “The last one Daemon process is $!”
2盒卸、接收鍵盤輸入
read 【選項(xiàng)】【變量名】
選項(xiàng) | 功能 |
---|---|
-p “提示信息" | 在等待read輸入時(shí),輸出提示信息 |
-t 秒數(shù) | read命令會(huì)一直等待用戶輸入次氨,使用此選項(xiàng)可以指定等待時(shí)間 |
-n 字符數(shù) | read命令只接收指定的字符數(shù)蔽介,就會(huì)執(zhí)行 |
-s | 隱藏輸入的數(shù)據(jù),只用于機(jī)密信息的輸入 |
#!/bin/bash
#Author:wangwei(Email:mr_wangwei@hotmail.com)read -t 30 -p "Please input your name:" name
#提示“請輸入姓名”并等待30秒煮寡,把用戶的輸入保存入變量name中 echo "Name is $name"read -s -t 30 -p "Please enter your age:" age
#年齡是隱私虹蓄,所以我們用“-s”選項(xiàng)隱藏輸入 echo -e "\n" echo “Age is $age”read -s -t 30 -p "Please select your gender[M/F]" gender
#使用“-n 1”選項(xiàng)只接收一個(gè)輸入字符就會(huì)執(zhí)行(都不用輸入回車)echo -e “\n”
echo "Sex is $gender"
Bash的運(yùn)算符
數(shù)值運(yùn)算與運(yùn)算符
1、declare聲明變量類型
declare 【+/-】【選項(xiàng)】變量名
選項(xiàng) | 說明 |
---|---|
- | 給變量設(shè)定類型屬性 |
+ | 取消變量的類型屬性 |
-i | 將變量聲明為整數(shù)型(interger) |
-x | 將變量聲明為環(huán)境變量 |
-p | 顯示指定變量的被聲明的類型 |
2幸撕、數(shù)值運(yùn)算
aa=11
bb=22
#給變量aa和變量bb賦值
方法一:declare -i
declare -i cc=$aa+$bb
方法二:expr或let數(shù)值運(yùn)算工具
dd=$(expr $aa + $bb)
#dd的值是aa和bb的和薇组。注意“+”號左右兩側(cè)必須有空格
方法三:“$((運(yùn)算式))“ 或 ”$[運(yùn)算式]“
ff=$(($aa+$bb))
gg=$[$aa+$bb]
3、運(yùn)算符
運(yùn)算符 | 優(yōu)先級 | 說明 |
---|---|---|
13 | -,+ | 單目負(fù)坐儿、單目正 |
12 | !,~ | 邏輯非、按位取反或補(bǔ)碼 |
11 | *,/,% | 乘貌矿、除炭菌、取模 |
10 | +,- | 加、減 |
9 | <<,>> | 按位左移站叼、按位右移 |
8 | <=,>=,<,> | 小于或等于娃兽、大于或等于、小于尽楔、大于 |
7 | ==,!= | 等于投储、不等于 |
6 | & | 按位與 |
5 | ^ | 按位異或 |
4 | | | 按位或 |
3 | && | 邏輯與 |
2 | || | 邏輯或 |
1 | =,+=,-=,*=,/=,%=,&=,^=,|=,<<=,>>= | 賦值、運(yùn)算且賦值 |
變量測試與內(nèi)容替換
變量置換方式 | 變量y沒有設(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 |
測試x=${y-新值}
unset y
#刪除變量y
x=${y-new}
#進(jìn)行測試
echo $x
new
#因?yàn)樽兞縴不存在下梢,所以x=new
y=""
#給變量y賦值為空
x=${y-new}
#進(jìn)行測試
echo $x
#x為空
y=old
#給變量y賦值
x=${y-new}
#進(jìn)行測試
echo $x
old
環(huán)境變量配置文件
環(huán)境變量配置文件簡介
1客蹋、sourece命令
更改配置文件需要重啟系統(tǒng)讓配置文件生效,如果想要直接生效就使用該命令
source 配置文件
或
.source
2孽江、環(huán)境變量配置文件簡介
環(huán)境變量配置文件中主要是定義對系統(tǒng)的操作環(huán)境生效的系統(tǒng)默認(rèn)環(huán)境變量讶坯,比如PATH、HISTSIZE岗屏、PS1辆琅、HOSTNAME等默認(rèn)環(huán)境變量
/etc/profile
/etc/profile.d/*.sh
~/.bash_profile
~/.bashrc
/etc/bashrc
環(huán)境變量配置文件作用
/etc/profile的作用
USER變量:
LOGNAME變量:
MAIL變量:
PATH變量:
HOSTNAME變量:
HISTSIZE變量:
umask:
調(diào)用/etc/profile.d/*.sh文件
其他配置文件和登錄信息
1漱办、注銷時(shí)生效的環(huán)境變量配置文件
~/.bash_logout
2、其他配置文件
~/bash_history
3婉烟、Shell登錄信息
本地終端歡迎信息:/etc/issue
轉(zhuǎn)移符 | 作用 |
---|---|
\d | 顯示當(dāng)前系統(tǒng)時(shí)間 |
\s | 顯示操作系統(tǒng)名稱 |
\l | 顯示登錄的終端號娩井,這個(gè)比較常用 |
\m | 顯示硬件體系結(jié)構(gòu),如i386似袁、i686等 |
\n | 顯示主機(jī)名 |
\o | 顯示域名 |
\r | 顯示內(nèi)核版本 |
\t | 顯示當(dāng)前系統(tǒng)時(shí)間 |
\u | 顯示當(dāng)前登錄用戶的序列號 |
遠(yuǎn)程終端歡迎信息:/etc/issue.net
轉(zhuǎn)義符在/etc/issue.net文件中不能使用
是否顯示此歡迎信息洞辣,由ssh的配置文件/etc/ssh/sshd_config決定,加入“Banner/etc.issue.net”行才能顯示(記得重啟SSH服務(wù))
登陸后歡迎信息:/etc/motd
不管是本地登錄還是遠(yuǎn)程登錄昙衅,都可以顯示此歡迎信息