Shell基礎(chǔ)

Shell基礎(chǔ)

Shell概述

1、Shell是什么

Shell是一個(gè)命令行解釋器,它為用戶提供了一個(gè)向Linux內(nèi)核發(fā)送請求以便運(yùn)行程序的界面系統(tǒng)級(jí)程序,用戶可以用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 暫停,并放入后臺(tái)。這個(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、輸出重定向

辣雞簡書不支持html

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 : 輸出行號(hào)

-v : 反向查找

--color=auto 搜索出的關(guān)鍵字用顏色顯示

通配符與其他特殊符號(hào)

1、通配符

通配符 作用
? 匹配一個(gè)任意字符
* 匹配0個(gè)或任意多個(gè)任意字符,也就是可以匹配任何內(nèi)容
[] 匹配中括號(hào)中任意一個(gè)字符。例如:[abc]代表一定匹配一個(gè)字符,或者是a,或者是b,或者是c
[-] 匹配中括號(hào)中任意一個(gè)字符,-代表一個(gè)范圍。例如:[a-z]代表匹配一個(gè)小寫字母
[^] 邏輯非,表示匹配不是中括號(hào)內(nèi)的一個(gè)字符。例如:【^0-9】代表匹配一個(gè)不是數(shù)字的字符

2、Bash中其他特殊符號(hào)

符號(hào) 作用
‘ ’ 單引號(hào)。在單引號(hào)中所有的特殊符號(hào),如“S”和“`”反引號(hào)都沒有特殊含義
“ ” 雙引號(hào)。在雙引號(hào)中特殊符號(hào)都沒有特殊含義,但是“S”、“`”、“\”是例外,擁有“調(diào)用變量的值”、“引用命令”和轉(zhuǎn)義符“”的特殊含義
`` 反引號(hào)。反引號(hào)括起來的內(nèi)容是系統(tǒng)命令,在Bash中會(huì)先執(zhí)行它。和()作用一樣,不過推薦使用(),因?yàn)榉匆?hào)非常容易看錯(cuò)。
$() 和反引號(hào)的作用一樣,用來引用系統(tǒng)命令
# 在shell腳本中,#開頭的行代表注釋。
$ 用于變量的值,如果需要調(diào)用變量name的值時(shí),需要用$name的方式得到變量的值。
\ 轉(zhuǎn)義符,跟在\之后的特殊符號(hào)將失去特殊含義,變?yōu)槠胀ㄗ址H?將輸出“$”符號(hào),而不當(dāng)做是變量引用。

Bash變量

用戶自定義變量

1、什么是變量

變量是計(jì)算機(jī)內(nèi)存的單元,其中存放的值可以改變。

2、變量設(shè)置規(guī)則

變量名稱可以由字母、數(shù)字好人下劃線組成,但是不能以數(shù)字開頭。如果變量名稱是“2name”則是錯(cuò)誤的。

在Bash中,變量的默認(rèn)類型都是字符串型,如果要進(jìn)行數(shù)值運(yùn)算,則必須指定變量類型為數(shù)值型。

變量的值如果有空格,需要使用單引號(hào)或雙引號(hào)包括。

在變量的值中,可以使用“\”轉(zhuǎn)義符。

如果需要增加變量的值,那么可以進(jìn)行變量值的疊加。不過變量需要用雙引號(hào)包含“變量名”或使用{變量名}包含

如果是把命令的結(jié)果作為變量值賦予變量,則需要使用反引號(hào)或$()包含命令。

環(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è)命令

: 提示符。如果是root用戶會(huì)顯示提示符為“#”,如果是普通用戶會(huì)顯示提示符為“

例如:

PS1='[\u@t \w]$'

PS1='[\u@@ \h # \w]$'

PS1='[\u@\h \W]$'

位置參數(shù)變量
位置參數(shù)變量 作用
$n n為數(shù)字,¥0代表命令本身,1-9代表第一到第九個(gè)參數(shù),十以上的參數(shù)需要用大括號(hào)包含,如${10}.
$* 這個(gè)變量代表命令行中所有的參數(shù),$*把所有的參數(shù)看成一個(gè)整體
$@ 這個(gè)變量也代表命令行中所有的參數(shù),不過$@把每個(gè)參數(shù)區(qū)分對待
$# 這個(gè)變量代表命令行中所有的參數(shù)個(gè)數(shù)

例子:

*與@的區(qū)別

#!/bin/bash

for i in "$*"
#*中的所有參數(shù)看成是一個(gè)整體,所以這個(gè)for循環(huán)只會(huì)循環(huán)一次 do ? echo "The parameters is: \i"
done
x=1

for y in "$@"
#$@中每個(gè)參數(shù)都看成是獨(dú)立的,所以“$@”中有幾個(gè)參數(shù),就會(huì)循環(huán)幾次
do ?
echo "The parametersx is:y" ?
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)程號(hào)(PID)
$! 后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的進(jìn)程號(hào)(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)程的PID

find /root -name hello.sh &
#使用find命令在root目錄下查找hello.sh文件
#符號(hào)&的意思是把命令放入后臺(tái)執(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的和。注意“+”號(hào)左右兩側(cè)必須有空格

方法三:“$((運(yùn)算式))“ 或 ”$[運(yùn)算式]“

ff=$(($aa+$bb))

gg=$[$aa+$bb]

3、運(yùn)算符

運(yùn)算符 優(yōu)先級(jí) 說明
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 顯示登錄的終端號(hào),這個(gè)比較常用
\m 顯示硬件體系結(jié)構(gòu),如i386、i686等
\n 顯示主機(jī)名
\o 顯示域名
\r 顯示內(nèi)核版本
\t 顯示當(dāng)前系統(tǒng)時(shí)間
\u 顯示當(dāng)前登錄用戶的序列號(hào)

遠(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)程登錄,都可以顯示此歡迎信息

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。