溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

LINUX中shell腳本編程的方法是什么

發(fā)布時(shí)間:2022-01-07 16:05:20 來(lái)源:億速云 閱讀:118 作者:iii 欄目:網(wǎng)絡(luò)安全

這篇文章主要介紹了LINUX中shell腳本編程的方法是什么的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇LINUX中shell腳本編程的方法是什么文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

一. shell簡(jiǎn)介

當(dāng)命令不在命令行中執(zhí)行,而是從一個(gè)文件中執(zhí)行時(shí),該文件就稱為 Shell 腳本。shell腳本是純文本文件,以行為單位逐行執(zhí)行。

相當(dāng)于一種命令翻譯器。

二. shell腳本的編寫(xiě)

2.1腳本的創(chuàng)建

使用文本編輯器(或touch)創(chuàng)建腳本文件

語(yǔ)法:touch a.sh

2.2腳本的執(zhí)行

將腳本添加可執(zhí)行權(quán)限

語(yǔ)法:chmod +x a.sh

執(zhí)行腳本命令:

(1)./a.sh

(2)sh a.sh

(3)source a.sh //不需要x權(quán)限

2.3腳本的編寫(xiě)

編輯腳本:vim a.sh

#!/bin/bash //系統(tǒng)以bash解釋器執(zhí)行腳本

cd /etc/

pwd //命令語(yǔ)句

三. shell功能

3.1重定向

重定向輸出:將命令的執(zhí)行結(jié)果覆蓋到目標(biāo)文件

語(yǔ)法:df > a.txt //將磁盤(pán)信息覆蓋到a.txt文件

重定向追加:uname -p >> a.txt //將處理器類型追加到a.txt

重定向輸入:

vim pass.txt

123456

passwd --stdin jerry < pass.txt //標(biāo)準(zhǔn)輸入

tail -2 /etc/shadow //查看用戶密碼信息后兩行

3.2管道符號(hào)

將左側(cè)的命令輸出結(jié)果,作為右側(cè)命令的處理對(duì)象

cat a.txt |grep “123” //篩選出含字符串“123”的行

grep "bash$" /etc/passwd | awk -F: '{ print $1,$7 }' //-F:后要求有空格

例:提取根分區(qū)/的磁盤(pán)使用情況

df -hT //查看磁盤(pán)使用情況-h顯示更易讀-T顯示文件系統(tǒng)類型

df -hT | grep "/$" | awk '{print $6}'

四. shell變量

shell變量用來(lái)存放系統(tǒng)和用戶需要使用的特定參數(shù)(值),而且這些參數(shù)可以根據(jù)用戶的設(shè)定或系統(tǒng)環(huán)境的變化而相應(yīng)變化。

4.1自定義變量

4.1.1定義一個(gè)新的變量(輸入)

格式:變量名=變量值

4.1.2查看變量的值(輸出)

格式:echo $變量名

echo命令的選項(xiàng):

-n:取消自動(dòng)換行

-e:使用轉(zhuǎn)義字符,把字符串中某些字符當(dāng)成特殊字符處理

\t:制表符

\n:換行符

\b:刪除前一個(gè)字符

\f:換行但光標(biāo)仍舊停留在原來(lái)的位置

\r:光標(biāo)移至行首,但不換行

賦值時(shí)使用引號(hào)

雙引號(hào):允許通過(guò)$符號(hào)引用其他變量值

單引號(hào):禁止引用其他變量值,$視為普通字符

反撇號(hào):命令替換,提取命令執(zhí)行后的輸出結(jié)果

4.1.3從鍵盤(pán)輸入內(nèi)容為變量賦值(提示輸入)

格式: read [-p "提示信息"] 變量名

4.2整數(shù)變量運(yùn)算

Shell變量的數(shù)值運(yùn)算多用于腳本程序的過(guò)程控制,只能進(jìn)行整數(shù)運(yùn)算,不支持小數(shù) 運(yùn)算。整數(shù)的運(yùn)算主要通過(guò)內(nèi)部命令Expr進(jìn)行。

格式:expr 變量1 運(yùn)算符 變量2 [運(yùn)算符 變量3]... //注意空格

常用運(yùn)算符:加(+)、減(-)、乘(\*)、除(/)、取模(%)

例:設(shè)置X(值為35)、Y(值為16)兩個(gè)變量,并進(jìn)行加、減、乘、除、取模運(yùn)算

X=35

Y=16

expr $X + $Y

expr $X - $Y

expr $X \* $Y //乘法符號(hào)在shell中有其它含義,運(yùn)算時(shí)需要轉(zhuǎn)意符號(hào)

expr $X / $Y

expr $X % $Y

4.3環(huán)境變量

由系統(tǒng)提前創(chuàng)建,用來(lái)設(shè)置用戶的工作環(huán)境

配置文件:/etc/profile 、~/.bash_profile

env :查看當(dāng)前工作環(huán)境下的環(huán)境變量。

這表示為 $n,n為1~9之間的數(shù)字

例:編寫(xiě)一個(gè)加法運(yùn)算的小腳本a.sh,用來(lái)計(jì)算兩個(gè)整數(shù)的和。需要計(jì)算的兩個(gè)整數(shù)在執(zhí)行腳本時(shí)以位置變量的形式提供。

#vim a.sh

#!/bin/bash

SUM=`expr $1 + $2`

echo "$1 + $2 = $SUM"

#chmod +x a.sh

#./a.sh 12 24 //$1為12、$2為24

4.4預(yù)定義變量

是由Bash程序預(yù)先定義好的一類特殊變量,使用"$"符號(hào)和另一個(gè)符號(hào)組合表示。

$# :命令行中位置變量的個(gè)數(shù)

$* :所有位置變量的內(nèi)容

$? :表示上一條命令執(zhí)行后返回的狀態(tài),當(dāng)返回狀態(tài)值為0時(shí)表示執(zhí)行正常,非0值表示執(zhí)行異?;虺鲥e(cuò)

$0 :當(dāng)前執(zhí)行的進(jìn)程/程序名

例:編寫(xiě)一個(gè)備份小腳本

#vim mybak.sh

#!/bin/bash

TARFILE=beifen-`date +%s`.tgz

tar zcf $TARFILE $* &> /dev/null

echo "已執(zhí)行$0腳本,"

echo "共完成$#個(gè)對(duì)象的備份"

echo "具體內(nèi)容包括:$*"

#chmod +x mybak.sh

#./mybak.sh /boot/grub

#./mybak.sh /etc/passwd /etc/shadow

五. 測(cè)試腳本命令

5.1條件測(cè)試

測(cè)試特定的表達(dá)式是否成立,當(dāng)條件成立時(shí),測(cè)試語(yǔ)句的返回值為0,否則為其他數(shù)值

格式1:test 條件表達(dá)式

格式2:[ 條件表達(dá)式 ] //注意空格,中括號(hào)與表達(dá)式之間有空格

執(zhí)行條件測(cè)試操作以后,通過(guò)預(yù)定義變量"$?"獲取返回狀態(tài)值。

5.2文件測(cè)試

根據(jù)給定的路徑名稱,判斷對(duì)應(yīng)的是文件還是目錄,或者判斷文件是否可讀、 可寫(xiě)、可執(zhí)行等。

用法:[ 操作符 文件或目錄 ]

-d:測(cè)試是否為目錄(Directory)

-e:測(cè)試目錄或文件是否存在(Exist)

-f:測(cè)試是否為文件(File)

-r:測(cè)試當(dāng)前用戶是否有權(quán)讀取(Read)

-w:測(cè)試當(dāng)前用戶是否有權(quán)寫(xiě)入(Write)

-x:測(cè)試是否設(shè)置有可執(zhí)行權(quán)限(Excute)

例:

[ -d /media/cdrom ]

echo $?

0 //返回0表示條件成立,返回1表示條件不成立

使用邏輯與"&&"和echo命令一起更直觀的顯示結(jié)果

[ -d /media/cdrom ] $$ echo "yes"

yes

5.3整數(shù)值比較

根據(jù)給定的兩個(gè)整數(shù)值,判斷第一個(gè)與第二個(gè)數(shù)的關(guān)系

用法:[ 整數(shù)1 操作符 整數(shù)2]

-eq:等于(Equal)

-ne:不等于(Not Equal)

-gt:大于(Greater Than)

-lt:小于(Lesser Than)

-le:小于或等于(Lesser or Equal)

-ge:大于或等于(Greater or Equal)

例:判斷當(dāng)前已登錄的用戶數(shù),超出五個(gè)時(shí)輸出"Too many"

Unum=`who | wc -l` //查看當(dāng)前已登錄用戶數(shù)

[ $Unum -gt 5 ] && echo "Too many."

5.4字符串比較

通常用來(lái)檢查用戶輸入、系統(tǒng)環(huán)境等是否滿足條件

用法1:[ 字符串1 = 字符串2] [ 字符串1 != 字符串2 ]

用法2:[ -z 字符串 ] //檢查是否為空

通用 :[ 字符串1 操作符 字符串2 ]

例1:判斷當(dāng)前系統(tǒng)語(yǔ)言,不是"http://en.US"時(shí)輸出"Not http://en.US "

echo $LANG

[ $LANG != "http://en.US" ] && echo "Not http://en.US"

例2:用戶需輸入yes或no來(lái)確認(rèn)操作

read -p "是否覆蓋現(xiàn)有文件(yes/no)?" ACK

[ $ACK = "yes" ] && echo "覆蓋"

read -p "是否覆蓋現(xiàn)有文件(yes/no)?" ACK

[ $ACK = "no" ] $$ echo "不覆蓋"

5.5邏輯測(cè)試

判斷兩個(gè)或多個(gè)條件之間的關(guān)系

用法1:[ 表達(dá)式1 ] 操作符 [ 表達(dá)式2 ]

用法2:命令1 操作符 命令2

&& :邏輯與,“而且”,使用test命令時(shí)可改為"-a"

|| :邏輯或,“或者”,使用test命令時(shí)可改為"-o"

! :邏輯否,“不”

例:測(cè)試當(dāng)前系統(tǒng)內(nèi)核版本是否符合要求

uname -r

Mnum=$(uname -r | awk -F. '{print $1}')

Snum=$(uname -r | awk -F. '{print $2}')

[ $Mnum -eq 2 ] && [ $Snum -gt 4 ] && echo "符合要求"

六. if條件語(yǔ)句

根據(jù)復(fù)雜程度:?jiǎn)畏种У膇f語(yǔ)句,雙分支的if語(yǔ)句,多分支的if語(yǔ)句

6.1單分支if語(yǔ)句

只有條件成立時(shí)才會(huì)執(zhí)行一條相應(yīng)的代碼

用法:

if 條件測(cè)試

then 命令序列

fi

例:判斷掛載點(diǎn)目錄是否存在,若不存在則新建此目錄

vim chkmountdir.sh

#!/bin/bash

MOUNT_DIR="/media/cdrom/"

if [ ! -d $MOUNT_DIR ]

then

mkdir -p $MOUNT_DIR

fi

chmod +x chkmountdir.sh //給chkmountdir.sh執(zhí)行的權(quán)限

./chkmountdir.sh

6.2雙分支if語(yǔ)句

用法:

if 條件測(cè)試操作

then 命令序列1

else 命令序列2

fi

例:檢查目標(biāo)主機(jī)是否能連通,顯示相應(yīng)信息

vim pinghost.sh

#!/bin/bash

ping -c 3 -i 0.2 -w 3 $1 &> /dev/null //命令執(zhí)行時(shí)的消息都不看

if [ $? -eq 0] //判斷前一條命令的返回狀態(tài)

then

echo "Host $1 is up."

else

echo "Host $1 is down."

fi

chmod +x pinghost.sh

./pinghost.sh 192.168.4.11

6.3多分支if語(yǔ)句

用法:

if 條件測(cè)試操作1

then 命令序列1

elif 條件測(cè)試操作2

then 命令序列2

else

命令序列3

fi

例:判斷分?jǐn)?shù)范圍,分出優(yōu)秀、合格、不合格三擋

vim gradediv.sh

#!/bin/bash

read -p "請(qǐng)輸入您的分?jǐn)?shù)(0-100):" GRADE

if [ $GRADE -ge 85 ] && [ &GRADE -le 100 ]

then

echo "$GRADE 分!優(yōu)秀"

elif [ $GRADE -ge 70 ] && [ &GRADE -le 84 ]

then

echo "$GRADE 分,合格"

else

echo "$GRADE分?不合格"

fi

chmod +x gradediv.sh

./gradediv.sh

七. for循環(huán)語(yǔ)句

讀取不同的變量,用來(lái)逐個(gè)執(zhí)行同一組命令

用法:

for 變量名 in 取值列表

do

命令序列

done

例1:根據(jù)姓名列表批量添加用戶

vim /root/users.txt //用做測(cè)試列表文件

jdy

ttl

tcc

vim uaddfor.sh

#!/bin/bash

ULIST=$(cat /root/users.txt)

for UNAME in $ULIST //從列表文件讀取用戶名

do

useradd $UNAME

echo "123456" | passwd --stdin $UNAME &> /dev/null

//通過(guò)管道指定密碼字串

done

chmod +x uaddfor.sh

./uaddfor.sh

tail -3 /etc/passwd

例2:根據(jù)IP地址列表檢查主機(jī)狀態(tài)

vim /root/ipadds.txt

192.168.4.11

192.168.4.100

192.168.4.120

vim chkhosts.sh

#!/bin/bash

HLIST=$(cat /root/ipadds.txt)

for IP in $HLIST

do

ping -c 3 -i 0.2 -W 3 $IP &> /dev/null

if [ $? -eq 0 ] //嵌套if語(yǔ)句判斷連通性

then

echo "Host $IP is up."

else

echo "Host $IP is down."

fi

done

chmod +x chkhosts.sh

./chkhosts.sh

for循環(huán)語(yǔ)句非常適合用于列表對(duì)象無(wú)規(guī)律,且列表來(lái)源已經(jīng)固定。而對(duì)于要求控制循環(huán)次數(shù),操作對(duì)象按數(shù)字順序編號(hào)、按特定條件執(zhí)行重復(fù)操作等情況,則更適合while循環(huán)語(yǔ)句。

八. while循環(huán)語(yǔ)句

重復(fù)測(cè)試某個(gè)條件,只要條件成立則反復(fù)執(zhí)行

用法:

while 條件測(cè)試操作

do

命令序列

done

例:批量添加規(guī)律編號(hào)的用戶

#vim uaddwhile.sh

#!/bin/bash

PREFIX="stu"

i=1

while [ $i -le 20 ]

do

useradd ${[PREFIX}$i

echo "123456" | passwd --stdin ${PREFIX}$i &> /dev/null

let i++ //序號(hào)遞增,避免死循環(huán)

done

chmod +x uaddwhile.sh

./uaddwhile.sh

grep "stu" /etc/passwd | tail -3

例:猜價(jià)格游戲,要求由腳本預(yù)先生成一個(gè)隨機(jī)的價(jià)格數(shù)目(0-99)作為實(shí)際價(jià)格,判斷用戶猜測(cè)得價(jià)格是否高出或低于實(shí)際價(jià)格,給出相應(yīng)的提示后再次要求用戶猜測(cè),直到用戶猜中實(shí)際價(jià)格為止,輸出用戶共猜測(cè)的次數(shù)、實(shí)際價(jià)格。

#vim pricegame.sh

#!/bin/bash

PRICE=$(expr $RANDOM % 1000) //輸入price一個(gè)隨機(jī)數(shù)

TIMES=0

echo "商品實(shí)際價(jià)格范圍為0-999,猜猜看是多少?"

while true //循環(huán)條件:true

do

read -p "請(qǐng)輸入你猜測(cè)的價(jià)格數(shù)目:" INT

let TIMES++

if [ $INT -eq $PRICE ] ; then

echo "恭喜你答對(duì)了,實(shí)際價(jià)格是$PRICE"

echo "你總共猜測(cè)了$TIMES次"

exit 0

elif [ $INT -gt $PRICE ] ; then

echo "太高了!"

else

echo "太低了!"

fi

done

chmod +x pricegame.sh

./pricegame.sh

九. case分支語(yǔ)句

針對(duì)變量的不同取值,分別執(zhí)行不同的命令序列

用法:

case 變量值 in

模式1)

命令序列1

;;

模式2)

命令序列2

;;

......

*)

默認(rèn)命令序列

esac

例:檢查用戶輸入的字符類型

提示用戶從鍵盤(pán)輸入一個(gè)字符,通過(guò)case語(yǔ)句判斷該字符是否為字母、數(shù)字或者其他控制字符,并給出相應(yīng)的提示信息。

#vim hitkey.sh

#!/bin/bash

read -p "請(qǐng)輸入一個(gè)字符,并按Enter鍵確認(rèn):" KEY

case "$KEY" in

[a-z] || [A-Z])

echo "你輸入的是 字母."

;;

[0-9])

echo "你輸入的是 數(shù)字."

;;

*)

echo "你輸入的是 空格、功能鍵或其他控制字符."

esac

chmod -x hitkey.sh

./hitkey.sh

十. sed、awk語(yǔ)句

10.1 Sed簡(jiǎn)介

sed是stream editor(流編輯器)的縮寫(xiě),是一種在線編輯器,它一次處理一行內(nèi)容。sed是非交互式的編輯器。

處理時(shí),把當(dāng)前處理的行存儲(chǔ)在臨時(shí)緩沖區(qū)中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區(qū)中的內(nèi)容,處理完成后,把緩沖區(qū)的內(nèi)容送往屏幕。接著處理下一行,這樣不斷重復(fù),直到文件末尾。文件內(nèi)容并沒(méi)有改變,除非你使用重定向存儲(chǔ)輸出。

10.2 Sed命令用法

格式:sed+[選項(xiàng)]+‘命令’+文件名

常用選項(xiàng):

-n :取消默認(rèn)輸入

-e :多項(xiàng)編輯

-i :直接修改讀取的檔案內(nèi)容,而不是由屏幕輸出

常用命令:

a\ :當(dāng)前行后添加行

i\ :當(dāng)前行前添加行

c\ :用字符串替換行

d :刪除行

p :打印行

s :用一個(gè)字符串替換另一個(gè)

w :將所選的行寫(xiě)入文件

10.3 Sed定址

用于‘命令’之前,決定對(duì)哪些行進(jìn)行編輯。

如果沒(méi)有指定地址,sed將處理輸入文件的所有行。

1.地址是一個(gè)數(shù)字,則表示行號(hào);是“$"符號(hào),則表示最后一行。

2.地址可以指定范圍,當(dāng)需指定范圍時(shí)使用逗號(hào)(,)隔開(kāi)。

10.4 Sed用法

1.p命令

格式:sed -n ‘行號(hào)p’ 文件名

2.d命令

格式:sed -n ‘行號(hào)d’ 文件名

3.s命令

格式:sed -n ‘行號(hào)s/a/b/g’文件名

將文件中指定行里所有的a字符替換為b字符,g為全局變量

4.i命令

格式:sed -i ‘行號(hào)3d’文件名

直接修改文件內(nèi)容,不打印在屏幕上

5.e命令

格式:sed -e ‘3d’ -e ‘4p’ 文件名

先刪除第三行,再打印第四行字符

10.5 awk簡(jiǎn)介

awk是一個(gè)強(qiáng)大的文本分析工具,相對(duì)于grep的查找,sed的編輯,awk在其對(duì)數(shù)據(jù)分析并生成報(bào)告時(shí),顯得尤為強(qiáng)大。

簡(jiǎn)單來(lái)說(shuō)awk就是把文件逐行的讀入,以空格為默認(rèn)分隔符將每行切片,切開(kāi)的部分再進(jìn)行各種分析處理。

10.6 awk用法

1.格式:awk ' pattern {action} '

pattern常指關(guān)系表達(dá)式,例如:

awk‘/a/’file——顯示文件中包含a的行

awk‘$2>10’file——顯示第二列中數(shù)字大于10的行

2. 分隔提?。篴wk –F“分隔符”‘{print $1}’

例如:

awk –F.‘{print $1, print $2}’表示以點(diǎn)為分隔符將每一行的前二個(gè)字段,分行輸出

10.7 awk實(shí)例

判定輸入ip的有效性:

vim a.sh

#!/bin/bash

read -p “請(qǐng)輸入ip:” A

B=`echo $A |awk -F. “{print $1}”`

if [ $B -le 0 ] || [ $B -gt 255 ]

then echo “請(qǐng)輸入正確的IP”

else

echo “ok”

fi

chmod +x a.sh

sh a.sh

十一. shell實(shí)例

例1:編寫(xiě)一個(gè)系統(tǒng)服務(wù)腳本

vim myprog

#!/bin/bash

case "$1" in

start)

echo -n "正在啟動(dòng)sleep服務(wù)..."

if sleep 7200 &

then

echo "OK"

fi

;;

stop)

echo -n "正在停止sleep服務(wù)..."

pkill "sleep" &> /dev/sull

echo "OK"

;;

status)

if pgerp "sleep" &> /dev/sull ;

then

echo "sleep服務(wù)已經(jīng)啟動(dòng)."

else

echo "sleep服務(wù)已經(jīng)停止."

fi

;;

restart)

$0 stop

$0 start

;;

esac

chmod +x myprog

./myprog start

例2: shell打印九九乘法表

使用for循環(huán)

for i in $(seq 1 9)

do

for j in $(seq 1 $i)

do

echo -n “$j * $i” = $[i * j] “ ”

done

echo

done

//例中$[i * j]可寫(xiě)為:$((i * j))、$[$j*$i]、$(( $j * $i ))、`expr $i \* $j`

//修改:第二個(gè)do下加一行 let “temp = i * j”,再把$[i * j]改為:$temp

while 反向的乘法表:

i=9

j=1

while ((i>=1))

do

while ((j<=i))

do

echo -n “$j * $i”=$[$j * $i] “ ”

let j++

done

len j=1

let i--

echo “”

done

關(guān)于“LINUX中shell腳本編程的方法是什么”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“LINUX中shell腳本編程的方法是什么”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI