中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

指紋鎖在什么網(wǎng)站做宣傳好/注冊(cè)網(wǎng)址

指紋鎖在什么網(wǎng)站做宣傳好,注冊(cè)網(wǎng)址,手機(jī)微信可以做網(wǎng)站嗎,要建設(shè)網(wǎng)站目錄 前言 一、概述 1、什么是shell? 2、shell腳本的用途有哪些? 3、常見(jiàn)的shell有哪些? 4、學(xué)習(xí)shell應(yīng)該從哪幾個(gè)方面入手? 4.1、表達(dá)式 1)變量 2)運(yùn)算符 4.2、語(yǔ)句 1)條件語(yǔ)句&am…

目錄

前言

一、概述

1、什么是shell?

2、shell腳本的用途有哪些?

3、常見(jiàn)的shell有哪些?

4、學(xué)習(xí)shell應(yīng)該從哪幾個(gè)方面入手?

4.1、表達(dá)式

1)變量

2)運(yùn)算符

4.2、語(yǔ)句

1)條件語(yǔ)句:

a)單分支if

b)雙分支if

c)多分支if

2)分支語(yǔ)句:

a)使用shell腳本編寫(xiě)Nginx啟停命令

3)循環(huán)語(yǔ)句:

4.3、函數(shù)

4.4、正則表達(dá)式

1)基礎(chǔ)正則

a)查找特定字符

b)利用[]查找集合字符

c)查找行首"^"與行尾"$"?

?編輯

2)擴(kuò)展正則

a)+,重復(fù)一個(gè)或一個(gè)以上的前一個(gè)字符

b)?,零個(gè)或者一個(gè)前一個(gè)字符

c)|,使用或者的方式找出多個(gè)字符

d)(),查找組字符串

e)()+,辨別多個(gè)重復(fù)的組

3)常見(jiàn)正則表達(dá)式

a)數(shù)字

b)字符串

c)Email

d)Url?

e)IP

f)Tel?

g)日期校驗(yàn)

4.5、文件操作四劍客

1)grep進(jìn)階

2)egrep

3)find進(jìn)階

4)sed

a)語(yǔ)法

b)選項(xiàng)

c)操作

d)案例

5)awk

a)語(yǔ)法

b)選項(xiàng)

c)內(nèi)建變量

d)案例:

5、使用shell腳本應(yīng)該注意些什么?

5.1、shell命名

5.2、常見(jiàn)的shell腳本編寫(xiě)規(guī)范

5.3、shell腳本

5.4、shell運(yùn)行規(guī)則

5.5.、?shell腳本運(yùn)行追蹤

6、read -p "提示語(yǔ)" 變量名

7、拓展知識(shí)

7.1、返回100內(nèi)隨機(jī)數(shù)

7.2、返回1到10 的連續(xù)數(shù)字

7.3、返回1.1 2.1 3.1.... 10.1

二、表達(dá)式

1、變量

1.1、組成

1.2、類型

1)系統(tǒng)內(nèi)置變量(環(huán)境變量)

2)自定義變量

3)位置變量

4)預(yù)定義變量

1.3、作用域

1.4、輸出

1.5、shell中的字符串

2、運(yùn)算符

2.1、數(shù)學(xué)運(yùn)算

2.2、賦值

2.3、比較運(yùn)算?

1)數(shù)值比較

2)字符串比較

3)文件比較

2.4、邏輯運(yùn)算符

總結(jié)


前言

? ? ? ?純屬本人個(gè)人看法,目前對(duì)shell腳本也是一知半解,經(jīng)過(guò)查閱資料,整理內(nèi)容,寫(xiě)出這篇shell腳本基礎(chǔ),大多數(shù)內(nèi)容簡(jiǎn)單易懂,可能會(huì)篇幅略長(zhǎng),請(qǐng)耐心觀看。

一、概述

1、什么是shell?

? ? ? ?Shell腳本是一種用于執(zhí)行一系列命令的腳本程序。它由一系列Shell命令組成,可以自動(dòng)化執(zhí)行一些任務(wù)或操作。Shell腳本通常由文本文件組成,其中包含一系列命令,這些命令按照順序執(zhí)行。

2、shell腳本的用途有哪些?

? ? ? ?Shell腳本可以在Unix、Linux和類Unix系統(tǒng)(如Mac OS)中使用。它們使用Shell解釋器來(lái)執(zhí)行命令,并且支持多種Shell解釋器,如Bash、Sh、Ksh等。

? ? ? ?Shell腳本的目的可以是自動(dòng)化常見(jiàn)任務(wù),例如文件操作、系統(tǒng)管理、軟件安裝和配置等。它們可以接受命令行參數(shù)、進(jìn)行條件判斷和循環(huán)操作,還可以利用變量、函數(shù)和控制流語(yǔ)句來(lái)實(shí)現(xiàn)更復(fù)雜的邏輯。

? ? ? ?編寫(xiě)Shell腳本需要具備一些基本的Shell編程知識(shí),包括如何聲明變量、使用條件語(yǔ)句、創(chuàng)建循環(huán)和函數(shù)等。腳本還可以利用系統(tǒng)提供的各種命令和工具來(lái)完成特定的任務(wù)。

3、常見(jiàn)的shell有哪些?

? ? ? ?常見(jiàn)的Shell腳本文件擴(kuò)展名包括.sh(Bash腳本)、.sh、.ksh、.csh等,可以在Shell命令行中運(yùn)行腳本文件,也可以將其配置為可執(zhí)行文件并直接運(yùn)行。

? ? ? ?Bourne Shell (sh):Bourne Shell是Unix操作系統(tǒng)中最早的原始shell,它提供了基本的命令和功能。它的特點(diǎn)是簡(jiǎn)單、高效,但功能相對(duì)有限。

? ? ? ?Bourne Again Shell (bash):Bash是Bourne Shell的改進(jìn)版本,也是目前最常用的shell。它保留了Bourne Shell的特性,并增加了許多新功能,如命令補(bǔ)全、歷史命令、條件語(yǔ)句等,使得用戶交互更方便、功能更強(qiáng)大。

? ? ? ?C Shell (csh):C Shell是以C語(yǔ)言為基礎(chǔ)的shell,它提供了許多C語(yǔ)言風(fēng)格的語(yǔ)法和功能,如循環(huán)、條件判斷、命令別名等。C Shell在交互性和用戶友好性方面有所提升。

? ? ? ? Korn Shell (ksh):Korn Shell是基于Bourne Shell的一個(gè)進(jìn)化版本,它兼容Bourne Shell,并添加了許多新特性,如數(shù)組、命令行編輯等。Korn Shell是一種功能強(qiáng)大且通用的shell,被廣泛用于類Unix系統(tǒng)。

? ? ? ?Z Shell (zsh):Z Shell是Bourne Shell的擴(kuò)展版本,它增加了更多的功能和特性,并提供了更好的用戶交互體驗(yàn)。Z Shell支持命令補(bǔ)全、自動(dòng)糾正命令、自定義主題等,使得使用起來(lái)更加方便和高效。

4、學(xué)習(xí)shell應(yīng)該從哪幾個(gè)方面入手?

4.1、表達(dá)式

1)變量

? ? ? ?變量是計(jì)算機(jī)編程中用來(lái)存儲(chǔ)和表示數(shù)據(jù)的一個(gè)名稱,可以將其視為一個(gè)容器,用于存儲(chǔ)各種類型的值。變量在程序中可以被多次使用,并且可以在其中存儲(chǔ)不同的數(shù)據(jù)。

(個(gè)人感覺(jué))歸根結(jié)底變量可分為三大類:

? ? ? ?系統(tǒng)變量:系統(tǒng)變量是指在操作系統(tǒng)中預(yù)先定義的變量,用于存儲(chǔ)一些系統(tǒng)級(jí)的信息或配置。系統(tǒng)變量可以被所有的程序或用戶訪問(wèn)和使用。

? ? ? ?環(huán)境變量:環(huán)境變量是在操作系統(tǒng)中定義的一種特殊變量,用于存儲(chǔ)系統(tǒng)的各種配置信息、路徑和運(yùn)行時(shí)參數(shù)。環(huán)境變量可以通過(guò)操作系統(tǒng)設(shè)置或在程序中動(dòng)態(tài)定義和使用,對(duì)整個(gè)操作系統(tǒng)和所有程序起作用。常見(jiàn)的環(huán)境變量有PATH、HOME等。

echo $PATH  		命令所示路徑,以冒號(hào)為分割;
echo $HOME  		打印用戶家目錄;
echo $SHELL 		顯示當(dāng)前Shell類型;
echo $USER  		打印當(dāng)前用戶名;
echo $ID    		打印當(dāng)前用戶id信息;
echo $PWD   		顯示當(dāng)前所在路徑;
echo $TERM  		打印當(dāng)前終端類型;
echo $HOSTNAME      顯示當(dāng)前主機(jī)名;
echo $PS1           定義主機(jī)命令提示符的;
echo $HISTSIZE      歷史命令大小,可通過(guò) HISTTIMEFORMAT 變量設(shè)置命令執(zhí)行時(shí)間;
echo $RANDOM        隨機(jī)生成一個(gè) 0 至 32767 的整數(shù);
echo $HOSTNAME      主機(jī)名

? ? ? ?用戶變量:用戶變量是指在特定用戶環(huán)境中定義的變量,用于存儲(chǔ)用戶自己的信息或配置。這些變量通常具有用戶自定義的名稱,并且只對(duì)該用戶有效。用戶變量可以用于個(gè)性化定制用戶的工作環(huán)境。

從上述類別分別延伸出以下變量類別:

? ? ? ?位置變量:位置變量是指在程序中根據(jù)其在參數(shù)列表中的位置來(lái)進(jìn)行傳遞的變量。當(dāng)程序調(diào)用函數(shù)或方法時(shí),傳遞的參數(shù)可以按順序?qū)?yīng)函數(shù)或方法定義中的參數(shù)位置。在命令行中執(zhí)行程序時(shí),也可以通過(guò)位置參數(shù)傳遞數(shù)據(jù)。

? ? ? ?自定義變量:自定義變量是程序員自己聲明和定義的變量,用于存儲(chǔ)數(shù)據(jù)或表示特定的值。自定義變量的命名由開(kāi)發(fā)者自己決定,可以根據(jù)需要進(jìn)行賦值和操作。

? ? ? ?整型變量(int):整型變量用于存儲(chǔ)整數(shù)值,可以進(jìn)行基本的數(shù)值運(yùn)算。整數(shù)可以是正數(shù)、負(fù)數(shù)或零。例如,x = 5,y = -10。

? ? ? ?浮點(diǎn)型變量(float):浮點(diǎn)型變量用于存儲(chǔ)帶有小數(shù)點(diǎn)的數(shù)值,也可以進(jìn)行數(shù)值運(yùn)算。例如,x = 3.14,y = -0.25。

? ? ? ?字符串變量(str):字符串變量是用來(lái)存儲(chǔ)文本或字符序列的數(shù)據(jù)類型。字符串需要被包裹在引號(hào)(單引號(hào)或雙引號(hào))內(nèi)。例如,x = "Hello",y = 'World'。

? ? ? ?布爾型變量(bool):布爾型變量是用來(lái)存儲(chǔ)真(True)或假(False)的數(shù)據(jù)類型。它主要用于控制流程和條件判斷。例如,x = True,y = False。

? ? ? ?預(yù)定義變量是指在程序執(zhí)行過(guò)程中由解釋器或其他庫(kù)定義的變量。它們是一些特殊的變量,事先已經(jīng)定義好,并具有特定的含義。在Linux操作系統(tǒng)中,一些常見(jiàn)的預(yù)定義變量包括:

ARGV:表示命令行參數(shù)的列表。

argc:表示命令行參數(shù)的數(shù)量。

ENV:表示操作系統(tǒng)的環(huán)境變量。

等等還有很多,這里就不一一列舉了。

2)運(yùn)算符
算術(shù)運(yùn)算符

用于執(zhí)行數(shù)學(xué)運(yùn)算,如加法、減法、乘法、除法等。

常見(jiàn)的算術(shù)運(yùn)算符有+、-*、/

比較運(yùn)算符

用于比較兩個(gè)值或表達(dá)式的大小、相等性等關(guān)系。

常見(jiàn)的比較運(yùn)算符有==、!=、><、>=、<=

邏輯運(yùn)算符

用于對(duì)布爾值進(jìn)行邏輯運(yùn)算。

常見(jiàn)的邏輯運(yùn)算符有andor、not

賦值運(yùn)算符

用于將一個(gè)值賦給一個(gè)變量。

常見(jiàn)的賦值運(yùn)算符有=、+=、-=*=、/=

成員運(yùn)算符

用于判斷一個(gè)值是否屬于一個(gè)集合(列表、元組、字典、集合等)。

常見(jiàn)的成員運(yùn)算符有innot in

身份運(yùn)算符

用于比較兩個(gè)對(duì)象的內(nèi)存地址是否相同。

常見(jiàn)的身份運(yùn)算符有isis not

位運(yùn)算符

用于對(duì)二進(jìn)制數(shù)進(jìn)行位級(jí)操作。

常見(jiàn)的位運(yùn)算符有&、|、^、<<>>

4.2、語(yǔ)句

1)條件語(yǔ)句:
a)單分支if

使用方式:

? ? ? ? ?if condition;then

? ? ? ? ?? ? ? ? ?command;
? ? ? ? ?fi

?編寫(xiě)腳本查看

#!/bin/bash
#條件語(yǔ)句
#定義一個(gè)變量方便后續(xù)使用
user_num=$[ $(w | wc -l) -2 ]#單分支if
if [ $user_num -gt 2 ];thenecho "當(dāng)前登錄過(guò)多!"
fi

賦予執(zhí)行權(quán)限并進(jìn)行檢查

b)雙分支if

使用方式:

????????if condition;then

????????????????command;

? ? ? ? else

? ? ? ? ? ? ? ? command;? ? ? ??
????????fi

#!/bin/bash
#條件語(yǔ)句
#定義一個(gè)變量方便后續(xù)使用
user_num=$[ $(w | wc -l) -2 ]#雙分支if
if [ $user_num -gt 5 ];thenecho "當(dāng)前登錄過(guò)多!"
elseecho "當(dāng)時(shí)登錄用戶適中!"
fi

?

?

c)多分支if

使用方式:

????????if condition;then

????????????????command;

? ? ? ? elif

? ? ? ? ? ? ? ? condition;then

????????????????command;

? ? ? ? elif

? ? ? ? ? ? ? ? condition;then

????????????????command;

? ? ? ? else

????????????????command;
????????fi

#!/bin/bash
#多分支if#設(shè)定一個(gè)數(shù)值范圍
#A:90~100
#B:80~89
#C:60~79
#D:0~59read -p "請(qǐng)輸入你要查詢的成績(jī):" score
if [ $score -lt 0 -o $score -gt 100 ];thenecho "輸入錯(cuò)誤!請(qǐng)輸入0~100的數(shù)字進(jìn)行查詢"$0
elseif [ $score -ge 90 -a $score -le 100 ];thenecho "等級(jí):A  評(píng)定:優(yōu)秀"elif [ $score -ge 80 -a $score -le 89 ];thenecho "等級(jí):B  評(píng)定:良好"elif [ $score -ge 60 -a $score -le 79 ];thenecho "等級(jí):C  評(píng)定:及格"elseecho "等級(jí):D  評(píng)定:不及格"fi
fi

2)分支語(yǔ)句:

case

使用方式:

? ? case $1 in
條件1)
?? ?語(yǔ)句
;;
條件2)+-+
?? ?語(yǔ)句
;;
*)
?? ?幫助信息
;;
esac

使用 case?編輯一個(gè)簡(jiǎn)單的shell腳本:

#!/bin/bash
#簡(jiǎn)單的case使用方式case $1 in
[0-9])echo "數(shù)字"
;;
[a-z]|[A-Z])echo "字母"
;;
*)echo "只能輸入數(shù)字或字母!請(qǐng)重新輸入:"
;;
esac

?

這里顯示11、aa、AA均不可用,因?yàn)槲覀冊(cè)诙x時(shí),只定義了單數(shù)字或字母的查詢,如果需要顯示多數(shù)字或字母可以:

#!/bin/bash
#簡(jiǎn)單的case使用方式case $1 in
[0-9]|[0-9][0-9])echo "數(shù)字"
;;
[a-z]|[a-z][a-z]|[A-Z]|[A-Z][A-Z])echo "字母"
;;
*)echo "只能輸入數(shù)字或字母!請(qǐng)重新輸入:"
;;
esac

a)使用shell腳本編寫(xiě)Nginx啟停命令

剛才的腳本是一個(gè)簡(jiǎn)單的case使用腳本,接下來(lái)我們配置一個(gè)簡(jiǎn)單的 nginx 啟停腳本:

第一步:下載源碼包進(jìn)行編譯安裝

nginx官方網(wǎng)站:nginx news

第二步:將下載好的軟件包放置在虛擬機(jī)中

第三步:解壓歸檔包并進(jìn)行編譯安裝?

tar xf nginx-1.20.2.tar.gz 
cd nginx-1.20.2/

./configure --prefix=/usr/local/nginx

? ? ? ? 依次補(bǔ)全缺失的依賴:( ps:每次補(bǔ)全缺失的依賴時(shí),需要再次進(jìn)行一次上述./conmfig ...命令檢查是否缺失依賴,如有缺失,需執(zhí)行下述命令進(jìn)行補(bǔ)充)

yum install -y pcre-devel
yum install -y zlib-devel

? ? ? ? 編譯安裝:

make && make install

?

安裝 nginx?時(shí)指定的路徑,nginx 啟動(dòng)腳本所在位置:

?進(jìn)入 /etc/init.d/ 編輯我們自己的啟停腳本

/etc/init.d/目錄解析:

? ? ? ?/etc/init.d目錄是用于存放系統(tǒng)啟動(dòng)和停止的腳本文件的目錄。這些腳本文件通常在系統(tǒng)啟動(dòng)和關(guān)閉過(guò)程中被執(zhí)行,用于啟動(dòng)和停止各種系統(tǒng)服務(wù)和進(jìn)程。這些腳本文件可以包含啟動(dòng)、關(guān)閉、重啟和卸載等不同的操作,通過(guò)在相應(yīng)的運(yùn)行級(jí)別(runlevel)中執(zhí)行,控制系統(tǒng)服務(wù)的啟動(dòng)和停止。

?創(chuàng)建腳本

vim /etc/init.d/ngninx
#!/bin/bash
#Nginx啟停腳本( start | stop | restart | reload ),支持多臺(tái)Nginx同時(shí)啟動(dòng)。
#Mr.王#定義服務(wù)啟動(dòng)優(yōu)先級(jí)
#chkconfig: 35 85 75#定義變量
NGINX="/usr/local/nginx/sbin/nginx"
ProfilePath=$2#使用定義if語(yǔ)句(雙分支)定義函數(shù)if [ -z $ProfilePath ];thenfunction start(){$NGINX}function stop(){$NGINX -s stop}function reload(){$NGINX -s reload}elsefunction start(){$NGINX -c $ProfilePath}function stop(){$NGINX -s stop -c $ProfilePath}function reload(){$NGINX -s reload -c $ProfilePath}fi
#設(shè)置開(kāi)關(guān)語(yǔ)句case $1 instart)startif [ $? -eq 0 ];thenecho "+---------------------------------------------+"echo -e "|服務(wù)正在啟動(dòng) ------> OK!                     |"echo "+---------------------------------------------+"elseecho "+---------------------------------------------------------+"echo "|服務(wù)已啟動(dòng)或出現(xiàn)其他故障,請(qǐng)依據(jù)提示信息進(jìn)行排查!       |"echo "+---------------------------------------------------------+"fi;;stop)stop 2> /dev/nullif [ $? -ne 0 ];thenecho "+----------------------------------+"echo "|服務(wù)器未啟動(dòng),不需要停止!        |"echo "+----------------------------------+"elseecho "+----------------------------------+"echo "|服務(wù)正在停止 ------> OK!          |"echo "+----------------------------------+"fi;;reload)reloadif [ $? -eq 0 ];thenecho "+-------------------------------------+"echo "|平滑加載配置文件中 ------> OK!       |"echo "+-------------------------------------+"elseecho "+-----------------------------------------------------+"echo "|服務(wù)未啟動(dòng)或者加載失敗,請(qǐng)依據(jù)錯(cuò)誤信息進(jìn)行排查!     |"echo "+-----------------------------------------------------+"fi;;restart)stop 2> /dev/null && startif [ $? -eq 0 ];thenecho "+-------------------------------------------------------+"echo "|服務(wù)重啟成功,正在加載 ------->                        |"echo "|                            服務(wù)加載完畢,Nginx  啟動(dòng)!|"echo "+-------------------------------------------------------+"elseecho "+-----------------------------------------------------+"echo "|服務(wù)未啟動(dòng)或者加載失敗,請(qǐng)依據(jù)錯(cuò)誤信息進(jìn)行排查!     |"echo "+-----------------------------------------------------+"fi;;*)echo "+---------------------------------------------------------------------+"echo "|請(qǐng)輸入正確選項(xiàng): $0 | start | stop | restart | reload   |"echo "+---------------------------------------------------------------------+";;esac

?腳本寫(xiě)完以后,賦予其執(zhí)行權(quán)限,對(duì)其進(jìn)行檢測(cè),看其是否正常工作

chmod +x /etc/init.d/nginx_scriprs

?兩種啟停方式:

./nginx_scriprs start
./nginx_scriprs stop
service nginx_scriprs start /usr/local/nginx/conf/nginx.conf
service nginx_scriprs stop /usr/local/nginx/conf/nginx.conf

重啟:?

?重載配置文件:

./nginx_scriprs reload
service nginx_scriprs reload /usr/local/nginx/conf/nginx.conf

啟動(dòng)前先關(guān)閉服務(wù),不然報(bào)錯(cuò)信息顯示不出來(lái)

?然后將腳本交給 server 服務(wù)管理

?隨便進(jìn)行輸入,檢測(cè)語(yǔ)句定義最后一個(gè)提醒內(nèi)容:

./nginx_scriprs aaaaaaaaaaaa

至此,我們自己的Nginx啟停腳本就已編寫(xiě)完畢,經(jīng)測(cè)試,已經(jīng)可以正常使用了。?

3)循環(huán)語(yǔ)句:

? ? for

for循環(huán)由while循環(huán)演變

? ? ? ? for 條件(i in 值)|((i=1;i<=10;i++))
do
?? ?語(yǔ)句
done

? ? while

? ? ? ? i=1????????????????

while 條件
do
?? ?語(yǔ)句
?? ?let ?i++
done

4.3、函數(shù)

在shell腳本中,有以下幾種類型的函數(shù):

? ? ? ?內(nèi)置的函數(shù):這些函數(shù)是shell特定的,可以直接調(diào)用。例如,echo、cd、pwd等。這些函數(shù)通常用于執(zhí)行基本的系統(tǒng)操作。

? ? ? ?自定義函數(shù):這些函數(shù)是由用戶自己定義的,用于封裝一系列的操作,以便在腳本中多次調(diào)用。自定義函數(shù)以關(guān)鍵字function或函數(shù)名開(kāi)頭,并在{}中包含函數(shù)的具體操作。

? ? ? ?外部命令函數(shù):這些函數(shù)實(shí)際上是調(diào)用外部命令或腳本文件??梢允褂?code>source或.來(lái)加載外部腳本文件,然后在腳本中調(diào)用外部腳本中的函數(shù)。

? ? ? ?匿名函數(shù)(匿名代碼塊):在某些shell解釋器中,可以使用{}來(lái)定義一個(gè)匿名函數(shù)或匿名代碼塊,然后在腳本中直接調(diào)用。

需要注意的是,不同的shell解釋器可能對(duì)函數(shù)的定義和調(diào)用方式有所不同。例如,Bash和Korn Shell(ksh)中的函數(shù)定義使用關(guān)鍵字function,而在其他Shell中,可以直接使用函數(shù)名進(jìn)行定義。

4.4、正則表達(dá)式

? ? ? ?正則表達(dá)式(Regular Expression)是一種用于匹配、搜索和處理文本的強(qiáng)大工具,它可以通過(guò)一種簡(jiǎn)潔的語(yǔ)法描述模式,并與文本進(jìn)行匹配。

? ? ? ?標(biāo)準(zhǔn)正則擴(kuò)展正則是正則表達(dá)式中的兩種語(yǔ)法標(biāo)準(zhǔn)。

? ? ? ?標(biāo)準(zhǔn)正則是指符合基本正則表達(dá)式語(yǔ)法標(biāo)準(zhǔn)的正則表達(dá)式?;菊齽t表達(dá)式語(yǔ)法只包含最基本的元字符和操作符,例如*、+、.等。標(biāo)準(zhǔn)正則通常用于一些較舊的工具和操作系統(tǒng)中,如grep、sed等。

? ? ? ?擴(kuò)展正則是在標(biāo)準(zhǔn)正則的基礎(chǔ)上擴(kuò)展出來(lái)的更加強(qiáng)大和豐富的正則表達(dá)式語(yǔ)法。擴(kuò)展正則語(yǔ)法引入了更多的元字符和操作符,例如{}、()、|等。擴(kuò)展正則通常用于一些較新的工具和操作系統(tǒng)中,如egrep、awk等。

? ? ? ?需要注意的是,不同的工具和操作系統(tǒng)對(duì)正則表達(dá)式的支持可能有所差異,有些工具可能支持?jǐn)U展正則,有些工具可能只支持標(biāo)準(zhǔn)正則。因此在使用正則表達(dá)式時(shí)需要根據(jù)具體的工具和環(huán)境選擇合適的語(yǔ)法標(biāo)準(zhǔn)。

在Shell基礎(chǔ)中,正則表達(dá)式通常用于以下操作:

? ? ? ?模式匹配:使用正則表達(dá)式可以匹配文本中符合某種模式的字符串。例如,可以使用正則表達(dá)式匹配所有以字母開(kāi)頭的單詞。

? ? ? ?字符串搜索和替換:使用正則表達(dá)式可以在文本中搜索符合某種模式的字符串,并進(jìn)行替換或修改。例如,可以使用正則表達(dá)式找到文本中的所有數(shù)字,并替換為特定字符串。

? ? ? ?字符串分割和提取:使用正則表達(dá)式可以將一個(gè)字符串分割成多個(gè)部分,或者提取出符合某種模式的子字符串。例如,可以使用正則表達(dá)式將一個(gè)CSV格式的文本分割成多個(gè)字段。

常見(jiàn)的正則表達(dá)式元字符包括:

? ? ? ?字符類:用方括號(hào)[]括起來(lái),例如[abc]表示匹配單個(gè)字符a、b或c。

? ? ? ?元字符:具有特殊含義的字符,例如.表示匹配任意字符,*表示匹配前一個(gè)字符的零個(gè)或多個(gè)重復(fù),+表示匹配前一個(gè)字符的一個(gè)或多個(gè)重復(fù)等。

? ? ? ?量詞:用于指定匹配的數(shù)量,例如{n}表示精確匹配n次,{m,n}表示匹配至少m次至多n次。

? ? ? ?錨點(diǎn):用于指定匹配的位置,例如^表示匹配字符串開(kāi)頭,$表示匹配字符串結(jié)尾。

? ? ? ?轉(zhuǎn)義字符:用于取消元字符的特殊含義,例如\可以將特殊字符轉(zhuǎn)義為普通字符。

? ? ? ?在Shell中,常用的正則表達(dá)式匹配工具包括grep、sedawk等命令。這些工具可以結(jié)合正則表達(dá)式來(lái)處理文本數(shù)據(jù),并實(shí)現(xiàn)各種功能,如文本搜索、替換和處理等。

1)基礎(chǔ)正則

創(chuàng)建一個(gè)文件用于適配下列各項(xiàng),內(nèi)容如下:

shirt
short
good
food
wood
wooooooood
gooood
adcxyzxyzxyz
abcABC
best
besssst
ofion
ofson
ofison
AxyzxyzC
test
tast
hoo
boo
joo
a)查找特定字符
cat 1 | grep -n 'good'

b)利用[]查找集合字符
cat 1 | grep -n '[wg]ood'

?? ? ? ? ? ? 匹配 g 或者 w??

cat 1 | grep -n '[^o]'

? ? ? ? ? ? 排除o

?這里顯示排除不掉,因?yàn)榉蠗l件 o 的還有很多

cat 1 | grep -n '[^hbjo]'

cat 1 | grep -n '[a-z]oo'

?? ? ? ? cat test.txt | grep -n '[0-9]'

c)查找行首"^"與行尾"$"?
cat 1 | grep -n '^[g]'

?

cat 1 | grep '\.$'
cat 1 | grep 'd$'

? ? ? ? ? ? \ 為轉(zhuǎn)義符

? ? d)查找任意一個(gè)字符"."與重復(fù)字符"*"

cat 1 | grep -n 'g..d'

cat 1 | grep -n 'ooo*'

? ? e)查找連續(xù)的字符范圍"{}",需要使用轉(zhuǎn)義符,"\{\}"

cat 1 | grep -n 'o\{2\}'

cat 1 | grep -n 'o\{2,5\}d'

cat 1 | grep -n 'o\{2,\}d'
2)擴(kuò)展正則
a)+,重復(fù)一個(gè)或一個(gè)以上的前一個(gè)字符
cat 1 | grep -nE 'wo+d'
cat 1 | egrep -n 'wo+d'

?

b)?,零個(gè)或者一個(gè)前一個(gè)字符
cat 1 | egrep -n 'goo?d'

c)|,使用或者的方式找出多個(gè)字符
cat 1 | egrep -n 'a|b|c'

?

d)(),查找組字符串
cat 1 | egrep -n 't(a|e|s)st'

e)()+,辨別多個(gè)重復(fù)的組
cat 1 | egrep -n 'A(x|y|z)+C'

3)常見(jiàn)正則表達(dá)式
a)數(shù)字

創(chuàng)建隨機(jī)正整數(shù),負(fù)正整數(shù),正浮點(diǎn)數(shù),負(fù)浮點(diǎn)數(shù),用做實(shí)驗(yàn)

echo $[$RANDOM%100] > 2
echo $[$RANDOM%100] >> 2
echo -$[$RANDOM%100] >> 2
echo -$[$RANDOM%100] >> 2
echo -$[$RANDOM%100].1 >> 2
echo -$[$RANDOM%100].1 >> 2
echo $[$RANDOM%100].1 >> 2
echo $[$RANDOM%100].1 >> 2

? ? ? ? “^[0-9]*[1-9][0-9]*$” //正整數(shù) ?

cat 2 | grep "^[0-9]*[1-9][0-9]*$"

?? ? ? ? “^((-\d+)|(0+))$” //非正整數(shù)(負(fù)整數(shù) + 0) ?

? ? ? ? “^-[0-9]*[1-9][0-9]*$” //負(fù)整數(shù) ??

cat 2 | grep "^-[0-9]*[1-9][0-9]*$"

? ? ? ? “^-?\d+$” //整數(shù)?

? ? ? ? “^\d+(\.\d+)?$” //非負(fù)浮點(diǎn)數(shù)(正浮點(diǎn)數(shù) + 0) ?

? ? ? ? “^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$” //正浮點(diǎn)數(shù)?

? ? ? ? “^((-\d+(\.\d+)?)|(0+(\.0+)?))$” //非正浮點(diǎn)數(shù)(負(fù)浮點(diǎn)數(shù) + 0)?

? ? ? ? “^(-?\d+)(\.\d+)?$” //浮點(diǎn)數(shù)?

b)字符串

? ? ? ? “^[A-Z]+$” //由26個(gè)英文字母的大寫(xiě)組成的字符串 ?

? ? ? ? “^[a-z]+$” //由26個(gè)英文字母的小寫(xiě)組成的字符串 ?

? ? ? ? “^[A-Za-z0-9]+$” //由數(shù)字和26個(gè)英文字母組成的字符串 ?

? ? ? ? “^\w+$” //由數(shù)字、26個(gè)英文字母或者下劃線組成的字符串

c)Email

? ? ? ? “^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$” //email地址 ?

? ? ? ? “^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$” ? //Email?

d)Url?

? ? ? ? “^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$” //url?

e)IP

? ? ? ? “^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$” ? //IP地址

f)Tel?

? ? ? ? /^((\+?[0-9]{2,4}\-[0-9]{3,4}\-)|([0-9]{3,4}\-))?([0-9]{7,8})(\-[0-9]+)?$/ ? ? //電話號(hào)碼

g)日期校驗(yàn)

? ? ? ? ? ?/^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/ ? // ?年-月-日 ? ?yyyy-MM-dd / yy-MM-dd 格式

? ? ? ? ? ?"^[0-9]{4}-((0([1-9]{1}))|(1[1|2]))-(([0-2]([0-9]{1}))|(3[0|1]))$" ? // 年-月- 日 ?yyyy-MM-dd 格式
?? ??? ? ?/^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/ ? // 月/日/年

4.5、文件操作四劍客

? ? ? ? 文件操作四劍客指的是Linux/Unix系統(tǒng)中的四個(gè)常用命令/工具,包括grep、awk、sed和find。這些工具都是用來(lái)處理文本文件的,可以通過(guò)各種方式查找、過(guò)濾和修改文件內(nèi)容,是Linux/Unix系統(tǒng)中非常強(qiáng)大和靈活的工具。

? ? ? ?grep:grep命令用于在文本中搜索匹配指定模式的行,并將其打印出來(lái)??梢允褂谜齽t表達(dá)式進(jìn)行模式匹配,支持在多個(gè)文件中搜索,具有強(qiáng)大的過(guò)濾和查找功能。

? ? ? ?awk:awk是一種數(shù)據(jù)處理和報(bào)表生成語(yǔ)言,也是一個(gè)命令行工具。它可以用來(lái)從文本文件中提取和處理數(shù)據(jù),支持對(duì)文件的逐行掃描和處理,可以根據(jù)分隔符對(duì)數(shù)據(jù)進(jìn)行分割,并根據(jù)需要進(jìn)行計(jì)算和格式化輸出。

? ? ? ?sed:sed是一種流編輯器,用于對(duì)文本文件進(jìn)行流式編輯。它可以按照指定的規(guī)則對(duì)文件進(jìn)行替換、刪除、插入和追加等操作。sed具有強(qiáng)大的文本轉(zhuǎn)換和處理能力,是文本處理中的重要工具。

? ? ? ?find:find命令用于在指定目錄下搜索滿足指定條件的文件,并將其找出來(lái)??梢酝ㄟ^(guò)文件名、文件類型、文件大小、修改時(shí)間等多種條件進(jìn)行查找。find命令還可以與其他命令配合使用,實(shí)現(xiàn)更復(fù)雜的文件操作。

? ? ? ?這四個(gè)工具在Linux/Unix系統(tǒng)中廣泛應(yīng)用于文本處理、數(shù)據(jù)分析、系統(tǒng)管理等場(chǎng)景,可以大大提高工作效率和操作靈活性。

1)grep進(jìn)階

? ? 選項(xiàng)

? ? ? ? -r? ? ? ? ? ? 遞歸掃描指定目錄下的每一個(gè)文件

? ? ? ? -l? ? ? ? ? ? 只顯示匹配到指定關(guān)鍵字的文件名,而不是文件內(nèi)容

? ? 案例

? ? ? ? 查看/etc目錄下所有包含bash的文件名

grep -rl bash /etc

2)egrep

? ? 完美支持正則表達(dá)式

egrep(擴(kuò)展的grep)是grep命令的一個(gè)變種,用于在文本文件中搜索匹配指定模式的行。它支持更廣泛的正則表達(dá)式語(yǔ)法,以及一些額外的功能。

與grep相比,egrep支持以下擴(kuò)展的正則表達(dá)式元字符:

  • |:用于指定多個(gè)模式之間的"或"關(guān)系。
  • ():用于分組模式。
  • +:表示前面的模式出現(xiàn)一次或多次。
  • ?:表示前面的模式出現(xiàn)零次或一次。
  • *:表示前面的模式出現(xiàn)零次或多次。
  • {n}:表示前面的模式出現(xiàn)恰好 n 次。
  • {n,}:表示前面的模式出現(xiàn)至少 n 次。
  • {n,m}:表示前面的模式出現(xiàn) n 到 m 次。

此外,egrep還提供了一些命令行選項(xiàng),如-i(忽略大小寫(xiě))、-v(反向匹配)等。

總的來(lái)說(shuō),egrep比grep更強(qiáng)大,更靈活,可以處理更復(fù)雜的模式匹配需求。但在許多系統(tǒng)中,grep和egrep是等效的,可互換使用。

3)find進(jìn)階

? ? 按照權(quán)限查找

find -perm 755
find -perm 644

?

?? ? 按照時(shí)間戳查找

find -atime 1
find -mtime 1
find -ctime 1

?? ? -exec:

? ? ? ?-exec是 find 命令自帶的一個(gè)參數(shù),用于執(zhí)行一條命令來(lái)處理每一個(gè)查找到的文件(或目錄)。對(duì)于每一個(gè)匹配到的文件,都會(huì)調(diào)用一次命令,因此速度較慢。

find /opt/zn/ -type f -exec ls -lh {} \;

? ? xargs:

? ? ? ?而 xargs 是一個(gè)獨(dú)立的命令,它可以從標(biāo)準(zhǔn)輸入中讀取數(shù)據(jù),并將其作為參數(shù)傳遞給其他命令執(zhí)行。相比于 -execxargs 可以批量處理文件,速度更快。

find /opt/zn/ -type f | xargs rm -rf

? ? ? ?注:結(jié)合上述,如果需要逐個(gè)處理每個(gè)文件,可以使用 -exec;如果需要批量處理文件,可以使用 xargs。?

4)sed
a)語(yǔ)法

? ? ? ? sed [選項(xiàng)] '操作' 參數(shù)?

? ? ? ? sed [選項(xiàng)] -f scriptfile 參數(shù)

b)選項(xiàng)

? ? ? ? -e:表示用指定命令或腳本處理

? ? ? ? -f:指定腳本文件

? ? ? ? -h:幫助

? ? ? ? -n:表示僅顯示處理后的結(jié)果

? ? ? ? -i:直接編輯文本文件

? ? ? ? -r:支持?jǐn)U展正則

c)操作

? ? ? ? a:增加,在當(dāng)前行下面以行增加指定內(nèi)容

? ? ? ? c:替換,將選定行替換

? ? ? ? d:刪除,刪除指定行

? ? ? ? i:插入,在選定行的上面插入一行

? ? ? ? p:打印

? ? ? ? s:替換,替換指定字符

? ? ? ? y:字符轉(zhuǎn)換

d)案例

? ? ? ? 1.輸出符合條件的文本:

相當(dāng)于cat

sed -n 'p' 1

?

?打印第3行

sed -n '3p' 1

打印第3到6行的內(nèi)容

sed -n '3,6p' 1

打印奇數(shù)行

打印偶數(shù)行?

sed -n 'n;p' 1

打印1到6行之間的奇數(shù)行

sed -n '1,6{p;n}' 1

從第5行開(kāi)始打印奇數(shù)行

sed -n '5,${p;n}' 1

匹配 abc

sed -n '/abc/p' 1

匹配從第5行開(kāi)始到包含 oo 的行

sed -n '5,/oo/p' 1

?

? ? ? ? ? ? sed -n '/the/,10p' test.txt ?? ?#匹配從包含the的行到第10行結(jié)束

打印包含 oo 的行號(hào)

sed -n '/oo/=' 1

?

? ? ? ? 2.刪除符合條件的文本

刪除第1行

nl 1 | sed '1d'

?范圍刪除1-20行

nl 1 | sed '1,20d'

?

注:刪除時(shí)不能跳著進(jìn)行刪除,不然會(huì)進(jìn)行報(bào)錯(cuò)。例如:

nl 1 | sed '1,3,5d'

刪除 good 所在行

nl 1 | sed '/good/d'

? ? ? ? 3.替換符合條件的文本

替換全文本

nl 1 | sed 's/oo/ZNZNZNZNZNZNZNZNZNZNZN/'

替換第4行

nl 1 | sed '3s/oo/ZNZNZN/'

替換匹配到的第 2 個(gè) oo

nl 1 | sed 's/oo/OO/2'

?

注:這里可以看到,我們匹配出來(lái)的第一個(gè) oo 并沒(méi)有任何變化,?

? ? ? ? 4.遷移符合條件的文本

? ? ? ? ? ? H:復(fù)制;g:覆蓋;G:追加行;w:保存;r:讀取;a:追加內(nèi)容

? ? ? ? ? ? sed '/the/{H;d};$G' test.txt #匹配the所在行并遷移至文件末尾

? ? ? ? ? ? sed '3aTest' test.txt #在第3行下面新建行并寫(xiě)入Test

? ? ? ? ? ? sed '/the/aTest' test.txt #匹配the所在行并在下一行寫(xiě)入Test

? ? ? ? 5.使用腳本編輯文件內(nèi)容

? ? ? ? ? ? vim opt.txt

? ? ? ? ? ? 1,5H

? ? ? ? ? ? 1,5d

? ? ? ? ? ? 16G

? ? ? ? ? ? sed -f opt.txt test.txt?? ?#將1到5行遷移至16行后

? ? ? ? 6.以上修改想要直接修改文本源文件,只需要加入選項(xiàng)"-i"

5)awk
a)語(yǔ)法

? ? ? ? awk 選項(xiàng) '模式或條件{編輯命令}' 文件1 文件2 ...

? ? ? ? awk -f 腳本文件 文件1 文件2 ...

b)選項(xiàng)

? ? ? ? -F? ? ? ? ? ? 指定每行的分隔符(默認(rèn)分隔符為空格)

c)內(nèi)建變量

? ? ? ? FS:指定每行的分隔符

? ? ? ? NF:指定當(dāng)前處理行的字段個(gè)數(shù)

? ? ? ? NR:當(dāng)前處理行的行號(hào)

? ? ? ? $0:當(dāng)前處理行的整行內(nèi)容

? ? ? ? $n:當(dāng)前處理的第n個(gè)字段

? ? ? ? FILENAME:處理文件名

? ? ? ? RS:數(shù)據(jù)記錄分隔,默認(rèn)是\n

d)案例:

? ? ? ? 1.按行輸出

? ? ? ? ? ? awk '{print}' test.txt ?? ? ?? ?#等同cat?

? ? ? ? ? ? awk 'NR>=1&&NR<=3{print}' test.txt?

? ? ? ? ? ? awk 'NR==1,NR==3{print}' test.txt #打印1到3行

? ? ? ? ? ? awk 'NR%2==0{print}' test.txt ?? ?#打印偶數(shù)行

? ? ? ? 2.按段輸出

? ? ? ? ? ? 默認(rèn)以"空格"分段!

? ? ? ? ? ? ifconfig ens33 |awk '/netmask/{print $2}' #篩選IP地址

? ? ? ? ? ? cat /etc/shadow | awk -F : '$2=="!!"{print $1}' #打印不能登錄系統(tǒng)的用戶

? ? ? ? 3.調(diào)用shell命令

? ? ? ? ? ? cat /etc/passwd | awk -F : '/bash$/{print | "wc -l"}' /etc/passwd ?? ?#統(tǒng)計(jì)能夠登錄系統(tǒng)的用戶個(gè)數(shù)?? ?

5、使用shell腳本應(yīng)該注意些什么?

5.1、shell命名

? ? ? ?shell腳本的名稱一般命名為英文(大寫(xiě)或xiaox),后綴以.sh、.zsh等結(jié)尾。不能使用特殊符合以及空格,最好是命名的時(shí)候一眼就能看出來(lái)這個(gè)腳本或命令是干什么用的,方便自己進(jìn)行操作亦方便后面使用的人進(jìn)行操作。

.sh這是最常見(jiàn)的Shell腳本后綴,表示該腳本是Bash Shell腳本
.bash這個(gè)后綴也用來(lái)表示Bash Shell腳本
.ksh表示Korn Shell腳本
.csh表示C Shell腳本
.tcsh表示Tenex C Shell腳本
.zsh表示Z Shell腳本
.shar表示Shell存檔,通常用于將多個(gè)Shell腳本合并為一個(gè)文件
.rpm表示RPM軟件包,其中可能包含Shell腳本
.ebuild表示Gentoo Linux系統(tǒng)中的Portage軟件包的構(gòu)建腳本
需要注意的是,這些后綴并不是嚴(yán)格規(guī)定的,可以根據(jù)個(gè)人或組織的喜好進(jìn)行自定義

5.2、常見(jiàn)的shell腳本編寫(xiě)規(guī)范

? ? 通常情況下? 第一行? 為:

#!/bin/bash

? ? ? ? 一般情況下,使用Bash作為默認(rèn)解釋器,可以寫(xiě)為#!/bin/bash。這樣系統(tǒng)會(huì)自動(dòng)調(diào)用Bash來(lái)解釋執(zhí)行腳本。如果需要使用其他Shell,可以相應(yīng)修改為對(duì)應(yīng)的路徑。

? ? 第二行? 為:

#腳本的說(shuō)明

? ? ? ?在第二行可以寫(xiě)上對(duì)腳本的簡(jiǎn)短說(shuō)明,用注釋符號(hào)"#"開(kāi)頭。例如:# 腳本的說(shuō)明。

? ? 第三行及以后? 為:

腳本正文

? ? ? ?從第三行開(kāi)始,編寫(xiě)腳本的正文部分,實(shí)現(xiàn)具體的功能。

此外,還有一些常見(jiàn)的Shell腳本編寫(xiě)規(guī)范:

  • 使用有意義的變量名:使用有描述性的變量名,可以提高代碼的可讀性和可維護(hù)性。
  • 使用縮進(jìn):使用適當(dāng)?shù)目s進(jìn)來(lái)使代碼結(jié)構(gòu)清晰,方便閱讀。
  • 添加注釋:在關(guān)鍵的地方添加注釋,解釋代碼的作用和用法,方便其他開(kāi)發(fā)者理解和維護(hù)代碼。
  • 錯(cuò)誤處理和日志記錄:對(duì)于可能出現(xiàn)錯(cuò)誤的地方,進(jìn)行錯(cuò)誤處理,并記錄日志??梢允褂脳l件語(yǔ)句、函數(shù)等來(lái)實(shí)現(xiàn)錯(cuò)誤處理和記錄日志的功能。
  • 使用函數(shù)和模塊化:將腳本分成多個(gè)函數(shù),提高代碼的可維護(hù)性和重用性。
  • 使用命令行參數(shù):可以為腳本添加命令行參數(shù),增加腳本的靈活性。
  • 添加退出狀態(tài)碼:在腳本結(jié)尾處使用"exit"命令并指定退出狀態(tài)碼,便于根據(jù)腳本的執(zhí)行結(jié)果進(jìn)行后續(xù)處理。

5.3、shell腳本

? ?shell腳本的變量不能以數(shù)字、特殊符號(hào)開(kāi)頭,可以使用下劃線( _ ),但不能使用破折號(hào)( - )

5.4、shell運(yùn)行規(guī)則

? ? 沒(méi)有x權(quán)限

bash?腳本所在路徑/腳本文件
source 腳本所在路徑/腳本文件
. 腳本所在路徑/腳本文件

注:后兩個(gè)執(zhí)行命令,在腳本中若存在 cd 時(shí),會(huì)切換到目標(biāo)目錄

? ? 有x權(quán)限

./腳本文件
腳本絕對(duì)路徑/腳本文件

5.5.、?shell腳本運(yùn)行追蹤

bash -x 腳本所在路徑/腳本文件

6、read -p "提示語(yǔ)" 變量名

? ? 讀取鍵盤(pán)輸入并賦值給變量名

7、拓展知識(shí)

7.1、返回100內(nèi)隨機(jī)數(shù)

$[$RANDOM%100]

7.2、返回1到10 的連續(xù)數(shù)字

seq 1 10

{1..10}

7.3、返回1.1 2.1 3.1.... 10.1

{1..10}.1

seq 1.1 10.1

?

?

二、表達(dá)式

查看系統(tǒng)中支持的shell

cat /etc/shells

?

?查看系統(tǒng)默認(rèn)shell

echo $SHELL

?

查看默認(rèn)字符集

locale

?

1、變量

1.1、組成

? ? 變量名不會(huì)發(fā)生變化

? ? ? ? ? ? 例如:杯子、瓢、容器等等。

? ? ? ? 聲明規(guī)范

? ? ? ? ? ? 不能是數(shù)字或數(shù)字開(kāi)頭

? ? ? ? ? ? 以字母或_開(kāi)頭

? ? ? ? ? ? 變量名中不能包含特殊字符

? ? ? ? 聲明方法

? ? ? ? ? ? 駝峰式? ? ? ? ? ? ? ? ? ? ?userName

? ? ? ? ? ? 雙駝峰? ? ? ? ? ? ? ? ? ? ?UserName

? ? ? ? ? ? shell寫(xiě)法? ? ? ? ? ? ? ? ?user_name

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? username

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USERNAME

ps:字母全為大寫(xiě)可稱為常量

? ? 變量值可以不斷發(fā)生變化(數(shù)字、字符)

? ? ? ? ? ? 例如上面提到的容器,其內(nèi)所承載的物體

1.2、類型

1)系統(tǒng)內(nèi)置變量(環(huán)境變量)
env

2)自定義變量
zn=zm

?

??? ? 等號(hào)兩邊不能有空格

? ? 數(shù)字形式:

zn=1

重復(fù)輸入同一條則上一條會(huì)被頂替。??

? ? 字符串形式:

? ? ? ? shell中可以不使用引號(hào)

? ? ? ? 當(dāng)包含有空格時(shí),需要使用引號(hào)

?? ? 引號(hào)的用法

? ? ? ? 不會(huì)引用變量值

? ? ? ? ? ? 單引號(hào)? ? ? ? ? ? ? ? '

? ? ? ? 會(huì)應(yīng)用變量值

? ? ? ? ? ? 雙引號(hào)? ? ? ? ? ? ? ? "

? ? ? ? 引用命令結(jié)果

? ? ? ? ? ? 反撇號(hào)? ? ? ? ? ? ? ? `

? ? ? ? ? ? $(命令)? ? ? ? ? ? ? ? 應(yīng)用場(chǎng)景較多

單引號(hào)‘’:強(qiáng)引用,六親不認(rèn),變量和命令都不識(shí)別,都當(dāng)成了普通的字符串,“最傻”
雙引號(hào)”“:弱引用,不能識(shí)別命令,可以識(shí)別變量,“半傻不精”
反撇號(hào)··:里面的內(nèi)容必須是能執(zhí)行的命令并且有輸出信息,變量和命令都識(shí)別,并且會(huì)將反向單引號(hào)的內(nèi)容當(dāng)成命令進(jìn)行執(zhí)行后,再交給調(diào)用反向單引號(hào)的命令繼續(xù),“最聰明
引用變量命 令 執(zhí) 行 結(jié) 果 {} 命令執(zhí)行結(jié)果命令執(zhí)行結(jié)果()
運(yùn)算$[] $(())
$() 或 ``引用命令執(zhí)行的結(jié)果
( ( ) ) 或 (()) 或(())或[]進(jìn)行運(yùn)算
使用或 " {}或"或"變量名” 劃定變量名的起止范圍

3)位置變量

? ? 腳本后參數(shù)所在的位置

? ? $1? ?~~? ? $9

系統(tǒng)定義下的? ls? 的帶顏色說(shuō)明的,此時(shí)沒(méi)有,因?yàn)槲覀儧](méi)有進(jìn)行定義。

?系統(tǒng)定義下的? ls

進(jìn)行更改,使其帶有顏色

查看

4)預(yù)定義變量

創(chuàng)建一個(gè)腳本進(jìn)行實(shí)驗(yàn),且注意前文命名規(guī)則!

vim shellscript.sh
chmod +x /root/shellscript.sh

注意:需要賦予腳本執(zhí)行權(quán)限( x )

?? ? $0? ? ? ? 腳本本身的名稱

 ./shellscript.sh 

?此時(shí)就陷入了無(wú)限調(diào)自己的命令(死循環(huán)),除非打斷進(jìn)程運(yùn)行(? ctrl+c? )

? ? $#? ? ? ? 腳本后參數(shù)的個(gè)數(shù)


? ? ? 此時(shí)我們可以看到,顯示了三個(gè)內(nèi)容。?

?不管輸入的內(nèi)容是否有效,$#只顯示數(shù)量

?? ? $*? ? ? ? 腳本運(yùn)行時(shí)參數(shù)的內(nèi)容(整體輸出)

?跟 echo 一樣,直接打印內(nèi)容

?? ?$@? ? ? ? 腳本運(yùn)行時(shí)參數(shù)的內(nèi)容(逐個(gè)輸出)

這樣查看的話,$* 和 $@并沒(méi)有什么區(qū)別

我們寫(xiě)一個(gè)簡(jiǎn)單的腳本進(jìn)行查看

?$* 整體輸出, $@ 單個(gè)輸出

?? ? $?? ? ? ? 腳本運(yùn)行完畢后的返回值

?例如:

?? ? ? ? 默認(rèn)情況

? ? ? ? ? ? 0? ? ? ? ? ? ? ? 成功

? ? ? ? ? ? 非0? ? ? ? ? ? 失敗

1.3、作用域

默認(rèn)變量只在當(dāng)前shell下生效

bash進(jìn)行刷新

若要在當(dāng)前及其子shell下生效,需要聲明為全局變量(? export? )? ?

1.4、輸出

echo $varName

1.5、shell中的字符串

? ? string

? ? 賦值: str1=foodfornoting.gpg

? ? 1)獲得字符串的長(zhǎng)度

? ? 語(yǔ)法:?? ?${#StringName}

? ? 案例:?? ?echo ${#str1}

? ? 輸出結(jié)果:17

? ? 2)字符串取子串

? ? 語(yǔ)法:?? ?${#StringName:position:lenght}

? ? 案例:?? ?echo ${str1:0:3}

? ? 輸出結(jié)果:foo

? ? 注意:lenght沒(méi)有定義時(shí),一直取到字符串的結(jié)尾!

? ? 3)字符串的截取

? ? a)從左至右截取最后一個(gè)匹配字符串string之后的所有字符串

? ? 語(yǔ)法:?? ?${StringName##*string}

? ? 案例:?? ?echo ${str1##*fo}

? ? 輸出結(jié)果:rnoting.gpg

? ? b)從左至右截取第一個(gè)匹配字符串string之后的所有字符串

? ? 語(yǔ)法:?? ?${StringName#*string}

? ? 案例:?? ?echo ${str1#*fo}

? ? 輸出結(jié)果:odfornoting.gpg

? ? c)從右至左截取最后一個(gè)匹配字符串string之后的所有字符串

? ? 語(yǔ)法:?? ?${StringName%%string*}?? ?

? ? 案例:?? ?echo ${str2%%o*}

? ? 輸出結(jié)果:f

? ? d)從右至左截取第一個(gè)匹配字符串string之后的所有字符串

? ? 語(yǔ)法: ${StringName%string*}

? ? 案例: echo ${str2%o*}

? ? 輸出結(jié)果:foodforn

? ? 4)字符串的拼接

? ? 語(yǔ)法:?? ?StringName3=${StingName1}${StringName2}

? ? 案例:?? ?str1=Hello

? ? ? ? str2=,Jack!

? ? ? ? str3=${str1}${str2}

? ? ? ? echo ${str3}

? ? 輸出結(jié)果: Hello,Jack!

? ? 5)字符串替換:

? ? 語(yǔ)法:?? ?${StringName/OldString/NewString}

? ? 案例:?? ?str1=foodfornoting.gpg

? ? ? ? echo ${str1/oo/kk}

? ? 輸出結(jié)果:fkkdfornoting.gpg

2、運(yùn)算符

2.1、數(shù)學(xué)運(yùn)算

+ - * / %+  等于加
-  等于減
*  等于乘
/  等于除
%  等于取余同時(shí) * 作為乘號(hào)時(shí)需要加轉(zhuǎn)義符\    例如 \*

? ? ? ?在Linux操作系統(tǒng)中,反斜杠(\)被用作轉(zhuǎn)義字符,用于表示特殊字符或者序列。它可以與一些特定的字母或符號(hào)組合在一起,形成一種轉(zhuǎn)義序列,具有特殊的含義。

以下是一些常見(jiàn)的轉(zhuǎn)義序列和它們的含義:

? ? ? ?\n:表示換行符。在打印輸出或者文本編輯器中,\n會(huì)使得光標(biāo)移到下一行的開(kāi)頭。

? ? ? ?\t:表示制表符。在打印輸出或者文本編輯器中,\t會(huì)在當(dāng)前位置插入一個(gè)制表符(通常是光標(biāo)移到下一個(gè)制表符位置)。

? ? ? ?\b:表示退格符。在打印輸出或者文本編輯器中,\b會(huì)使得光標(biāo)往前移動(dòng)一個(gè)位置,可以用來(lái)刪除前一個(gè)字符。

? ? ? ?\r:表示回車符。在打印輸出或者文本編輯器中,\r會(huì)使得光標(biāo)移到當(dāng)前行的開(kāi)頭,可以用來(lái)覆蓋之前的內(nèi)容。

? ? ? ?\:表示反斜杠字符本身。在某些需要顯示反斜杠的情況下,需要使用兩個(gè)反斜杠來(lái)表示。

? ? ? ?此外,還有其他一些轉(zhuǎn)義序列,如\’表示單引號(hào),\”表示雙引號(hào),\a表示警報(bào)聲等。這些轉(zhuǎn)義序列可以在字符串或輸出格式中使用。

?? ? ? ? 運(yùn)算方法

2.2、賦值

a=1
b=2
expr $a + $b

expr $((a+b))

echo $((a+b))

?

echo $[a+b]
expr $[a+b]

expr $a - $b

?

在乘作為運(yùn)算時(shí)需要添加轉(zhuǎn)義符,因?yàn)?* 號(hào)有通配符的意思,代表所有

expr $a / $b

?

??? ? ? ? 注意

? ? ? ? ? ? shell不支持浮點(diǎn)數(shù)的顯示

?

2.3、比較運(yùn)算?

&&條件 && 輸出結(jié)果
條件為真輸出
||條件 || 輸出結(jié)果
條件為假輸出
1)數(shù)值比較
-eq等于
-ne不等于
-lt小于
-le小于等于
-gt大于
-ge大于等于

2)字符串比較
=字符串一致
!=字符串不一致
-z?字符串為空
! -z?字符串不為空

3)文件比較
-e文件或目錄是否存在
-f是否為文件
-d是否為目錄
-r判斷文件是否可讀
-w判斷文件是否可寫(xiě)
-x判斷文件是否可執(zhí)行

2.4、邏輯運(yùn)算符

&&并且有假則假,全真為真
-a
||-o?或者有真則真,全假為假
!取反有真則假,有假則真

? ? ? 條件測(cè)試

[ $a -eq $b ] &&? echo OK
echo $?
[ $a -eq $b ] || ?echo OK
echo $?

總結(jié)

? ? ? ?在編寫(xiě)Shell腳本時(shí),可以參考官方文檔、教程和示例代碼等來(lái)學(xué)習(xí)和理解不同的概念和用法。最重要的是,要不斷練習(xí)和進(jìn)行實(shí)踐。通過(guò)編寫(xiě)簡(jiǎn)單的腳本并逐漸增加復(fù)雜度,逐漸熟悉Shell腳本編程。網(wǎng)絡(luò)上有很多的shell腳本示例,大家可以多去觀摩借鑒,先了解命令的使用方式、語(yǔ)法等,再開(kāi)始手動(dòng)編寫(xiě)腳本內(nèi)容。

http://www.risenshineclean.com/news/31.html

相關(guān)文章:

  • 如何查看網(wǎng)站空間大小/個(gè)人發(fā)布信息免費(fèi)推廣平臺(tái)
  • 加強(qiáng)政府網(wǎng)站建設(shè)的總結(jié)/西安seo代運(yùn)營(yíng)
  • 有做瀏覽單的網(wǎng)站/百度小說(shuō)風(fēng)云榜2022
  • 如何建設(shè)英文網(wǎng)站/淘寶店鋪買賣交易平臺(tái)
  • 開(kāi)一個(gè)網(wǎng)站建設(shè)公司/it培訓(xùn)四個(gè)月騙局
  • 廊坊市做網(wǎng)站/贛州seo排名
  • 手機(jī)商城網(wǎng)站開(kāi)發(fā)/seo流量的提升的軟件
  • 做澳洲外貿(mào)的網(wǎng)站有哪些/港港網(wǎng)app下載最新版
  • 不懂代碼用cms做網(wǎng)站/h5制作
  • 好的做網(wǎng)站公司/營(yíng)銷網(wǎng)站做的好的公司
  • 什么做網(wǎng)站/學(xué)生網(wǎng)頁(yè)制作成品
  • 福建建筑人才服務(wù)中心檔案/熱狗seo顧問(wèn)
  • 做網(wǎng)站困難嗎/優(yōu)秀網(wǎng)站設(shè)計(jì)欣賞
  • 做貨到付款的購(gòu)物網(wǎng)站/seo的中文含義是什么
  • 網(wǎng)站后臺(tái)是怎樣制作/經(jīng)典軟文案例100例簡(jiǎn)短
  • 2021年有沒(méi)有人給個(gè)網(wǎng)站/全網(wǎng)營(yíng)銷系統(tǒng)
  • 長(zhǎng)江設(shè)計(jì)公司/網(wǎng)絡(luò)優(yōu)化報(bào)告
  • 萬(wàn)網(wǎng)網(wǎng)站備案多久/免費(fèi)優(yōu)化網(wǎng)站
  • 上海網(wǎng)站排名優(yōu)化公司/谷歌seo快速排名軟件首頁(yè)
  • 網(wǎng)站建設(shè)開(kāi)發(fā)平臺(tái)/網(wǎng)絡(luò)服務(wù)器的作用
  • 做平面什么網(wǎng)站好用/百度禁止seo推廣
  • 中國(guó)平面設(shè)計(jì)網(wǎng)站/廣告營(yíng)銷案例分析
  • 網(wǎng)站建設(shè)橙子/百度教育app
  • 蘇省住房和城鄉(xiāng)建設(shè)廳網(wǎng)站首頁(yè)/百度應(yīng)用市場(chǎng)app下載安裝
  • 做網(wǎng)站需要源碼/河南做網(wǎng)站優(yōu)化