溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

bash shell基礎編程

發(fā)布時間:2020-06-12 21:35:35 來源:網(wǎng)絡 閱讀:457 作者:sswqzx 欄目:開發(fā)技術

. BASH Shell編程基礎

1. BASH Shell的可執(zhí)行文件

(1) 內(nèi)部命令

(2) 外部命令

(3) 腳本文件

?

2. BASH Shell的命令解釋過程

path指定范圍內(nèi)查找(外部命令)

......

3. BASH Shell的變量

(1) 變量的分類

-按作用域分

a. 局部變量

b. 全局變量

?

-按用途分

a. 自定義變量

b. 系統(tǒng)環(huán)境變量(path)

c. 特殊變量

?

(2) 定義和引用變量

-定義變量: 即用即定義、不用加$

: 可用export命令將變量輸出為全局變量

-引用變量: $變量名

-取消變量定義: unset變量名

?

(3) 系統(tǒng)環(huán)境變量

HISTSIZE?????? 定義歷史記錄的大小

PATH?????????? 定義通用路徑

LANG/LANGUAGE? 定義默認語言

HOSTNAME?????? 定義主機名

SHELL????????? 定義用戶的shell類型

USRENAME?????? 登陸名

HOME?????????? 用戶的家目錄

PWD??????????? 當前工作目錄

: env命令可以查看當前用戶環(huán)境的變量

?

(4) 特殊變量或預定義變量

$1-$9? 代表位置參數(shù)

$0???? 代表命令名稱

$$???? 命令進程的PZD

$#???? 命令的位置參數(shù)的個數(shù)

$*???? 命令的所有位置參數(shù)

?

4. BASH SHELL的運算符

(1) 算數(shù)運算符

+ -

(2) 比較運算符

-數(shù)值比較

-gt 大于

-eq 等于

-lt 小于

-ge 大于等于

-le 小于等于

-ne 不等于

?

-字符串比較

= 等于

!= 不等于

-z 判斷字符串是否為空

?

(3) 邏輯運算符

-a?

-o?

!??

?

(4) 文件判定運算符

-e? 判斷文件是否存在

-r? 判斷文件是否可讀

-w? 判斷文件是否可寫

-x? 判斷文件是否可執(zhí)行

-d? 判斷文件是否為目錄文件

-f? 判斷文件是否為普通文件

-c? 判斷文件是否為字符設備文件

-b? 判斷文件是否為塊設備文件

?

5. Bash Shell中的特殊字符

(1) 文件通配符

*????????????? 所有字符

?????????????? 任意單個字符

[..]?????????? 指定范圍內(nèi)的字符

[^/!..]??????? 指定非范圍內(nèi)的字符

{字符,...n}??? 指定集合內(nèi)的字符

?

(2) 替換符

-$????????????????? 引用變量

-${變量名}????????? 引用指定變量的值

-`命令`???????????? 引用指定命令的結果

-$(命令)??????????? 引用指定命令的結果

-$(( 算術表達式 ))? 引用指定表達式的值

?

(3) 其它特殊字符

-'字符'???????????? 表示字符串,關閉所有引用,引用所有被括起來的字符

-"字符"???????????? 表示字符串,引用所有除$``以外的字符

-\字符????????????? 轉義字符

?

6. BASH Shell提供的內(nèi)部命令

(1) echo

作用: 顯示指定內(nèi)容

格式: echo [參數(shù)] 字符串/表達式

實例: #echo "linuxsystem"

#echo -n"unix:"

#echo -n"china:"

-n 不換行輸出

?

(2) read

作用: 從鍵盤給指定變量賦值

格式: read 變量名

實例: #read a

?

(3) test

作用: 判斷表達式結果是否為真

格式: test? 表達式

實例: #test$USER="root" && echo "current user isadministrator"

#test -x/usr/sbin/useradd && /usr/sbin/useradd u3

: 可用[ 表達式 ]來替換test命令

x???? 文件存在并且可執(zhí)行

?

(4) if

作用: 實現(xiàn)條件分支

格式: if 表達式/命令;

then

...

命令

...

[else

...

命令

...

]

fi

實例: #if [`id-u`="0"];then echo "current user is root";else echo"current user is not root";fi

?

(5) case

作用: 實現(xiàn)多種條件分支

?

格式: case 變量 in

1)

...

命令

;;

2)

...

命令

;;

3)

...

命令

;;

....

*)

...

;;

esac

?

實例: #vi /script/sh2

#!/bin/bash

echo -n"Input:"

read a

case $ain

off)

poweroff

;;

windows)

init 5

;;

reboot)

reboot

;;

*)

echo"please input off/windows/reboot"

;;

esac

?

(6) for

作用: 實現(xiàn)循環(huán)執(zhí)行命令行

格式: for 變量名 [in 字符串]

do

...

命令行

...

done

實例: #for i in"/etc/*";do echo $i;done//遍歷etc下文件

?

(7) while

作用: 實現(xiàn)循環(huán)執(zhí)行命令行

格式: while 表達式/命令行

do

...

命令

...

done

?

實例: #vi /script/sh4

#!/bin/bash

a=1

s=0

while [$a -le 10 ]

do

s=$(($s+$a ))

a=$(($a+1 ))

done

echo $s

?

(8) exit

作用: 退出程序

格式: exit

?

(9) break/continue

作用: break???? 退出循環(huán)

continue? 進入下一次循環(huán)

格式: break

continue

?

(10) function

作用: 自定義函數(shù)

格式: function 函數(shù)名()

{

...

函數(shù)體

...

}

?

函數(shù)名

?

?

6. 執(zhí)行Bash腳本

(1) 方法一

設置腳本文件允許用戶具有執(zhí)行權限,然后用戶可輸入腳本的路徑即可執(zhí)行

#./5.sh

(2) 方法二

#bash 腳本路徑

?

7. 實例:

請編寫shell腳本,完成以下功能:

(1)shell腳本運行時會在屏幕上顯示以下畫面

*********************************************

*???????????????? Main Menu???????????????? *

*?????????? 1. poweroff???????????????????? *

*?????????? 2. start iptables?????????????? *

*?????????? 3. create user????????????????? *

*?????????? 4. exit???????????????????????? *

*********************************************

(2) 按菜單項前的數(shù)字可實現(xiàn)相應的功能

#vi? menu.sh

#functionmu()

#{clear

echo"*********************************************"

echo"*??????????????? Main Menu????????????????? *"

echo"*?????????? 1. poweroff???????????????????? *"

echo"*?????????? 2. start iptables?????????????? *"

echo"*?????????? 3. create user????????????????? *"

echo"*?????????? 4. exit???????????????????????? *"

echo"*********************************************"

#}

#functionft()

echo -n"please input:"

read f

case $fin

1)

poweroff

;;

2)

startiptables

;;

3)

echo -n"useradde"

read u

useradd$u

passwd? $u

;;

4)

exit

;;

*)

echo"please input 1/2/3"

;;

esac

?

mu

ft

?

#chmodu+x menu.sh

?

?

. 文本過濾命令

1. head

作用: 顯示指定文件的前n行內(nèi)容

格式: head [-數(shù)字] 文本文件

實例: #head -3/etc/passwd

?

2. tail

作用: 顯示指定文件的未尾n行內(nèi)容

格式: tail -n/+n/-f 文本文件

-f參數(shù),會實時的監(jiān)視某程序

實例: #tail -3/etc/passwd

#tail +3/etc/passwd

#tail -f/var/log/message

?

3. uniq

作用: 檢查及刪除文本文件中的重復行

格式: uniq [參數(shù)] 文本文件

實例: #uniq /abc/f1

#unisq-d /abc/f1

-d:只輸出重復的行

?

4. sort

作用: 對指定文本內(nèi)容排序顯示

實例: #sort /etc/f1

#sort-t: +2 -3 -n /etc/passwd

#sort -r/abc/f2

-n 數(shù)字大小排序

-r 反向排序

-t:+2? 從第二列開始排

?

?

5. grep

作用: 從文本文件中提取符合條件的行

格式: grep [參數(shù)] "匹配字符串" 文本文件

實例: #grep"root" /etc/passwd

#grep -c"root" /etc/passwd

#grep -q"root" /etc/passwd

#grep -v"root" /etc/passwd

#grep"^root:" /etc/passwd

-v? 反向匹配

-w? 完整匹配

-i? 忽略大小寫

-c ?只顯示符號要求的幾行

-q? quiet 安靜模式

?

?

6. sed

作用: sed是一種基于命令行的非交互式文本編輯器

格式: sed [參數(shù)] 子命令? 文本文件

?

實例: -輸出內(nèi)容: p子命令

#sed -n'/root/p' /etc/passwd? //顯示有root行的內(nèi)容

#sed -n'3p' /etc/passwd?? //顯示第三行內(nèi)容

#sed -n'3,10p' /etc/passwd? //顯示310行內(nèi)容

#sed -n'10,$p' /etc/passwd? //顯示10行到最后一行的內(nèi)容

?

-刪除內(nèi)容: d子命令

#sed'/root/d' /etc/passwd //刪除有root的行

#sed'4d' /etc/passwd? //刪除第四行

#sed '48d'/etc/passwd? //刪除48行的內(nèi)容

?

-替換內(nèi)容: s子命令

#sed's/root/admin/g' /etc/passwd? //root替換成admin

#sed -n's/root/admin/gp' /etc/passwd? //root替換成admin

?

-讀取指定文件內(nèi)容: r子命令

#sed '4r/abc/f1' /abc/f2

#sed '$r/etc/shadow' /etc/passwd //passwd要讀取的文件

?

?

-將符合條件的行寫入文件: w子命令

#sed -n'3,10w? /abc/f3' /etc/passwd //讀取/etc/passwd文件第三行到第十行寫入文件/abc/f3

?

-向文件添加內(nèi)容: a子命令

#sed'3a\linux system' /abc/f1 //第三行后面加上linux system

#sed'/root/a\unix' /abc/f1 //root的行后面加下unix

?

-向文件插入內(nèi)容: i子命令

#sed'3i\linux' /abc/f1? //向文件第三行插入linux字符串(新行)

?

-多次編輯: -e 參數(shù)

#sed -e'110d' -e 's/root/admin/g' /abc/f1

?

-n:使用安靜(silent)模式:匹配到的就顯示出來。反之不顯示

?

. awk

1. 什么是awk

awk是一種具有編程功能非交互式編輯器,可用于提取、修改文本內(nèi)容

?

2. awk的使用方法

方法一: #awk [參數(shù)] '{awk程序}' 文本文件

方法二: #awk [參數(shù)] -f 腳本文件 文本文件

方法三: #awk 腳本文件 文本文件

[-F|-f|-v]?? 大參數(shù),-F指定分隔符,-f調(diào)用腳本,-v定義變量var=value

?

3. 認識文本文件的記錄和字段

(1) 以特定記錄分隔符結束的內(nèi)容稱之為記錄,默認記錄分隔符為換行符,可用$0引用整個記錄

(2) 每個記錄中由特定字符分隔的內(nèi)容稱之為字段,默認字段分隔符為空格,可用$1-$n引用字段

ipadd? 192.168.16.99?mask 255.255.255.0? //一行為記錄、ipadd為記錄中的字段

?

4. awk提供的運算符、函數(shù)和變量

(1) awk的運算符

-算術運算符: + - */ %(取余) ^(乘方)

-關系運算符: <> <= >= == != ~(匹配) !~(不匹配)

-邏輯運算符:&& || !

-賦值運算符: = +=-= *= /= %= ^=

-自增、自減運算符: ++--

-數(shù)組引用: in

?

(2) awk的變量

-自定義變量

awk變量分為數(shù)值型和字符型,用戶引用變量時即定義了變量,變量類型由變量內(nèi)容決定,引用變量時不用加$

?

-內(nèi)置變量

FS?? 字段分隔符(默認是任何空格)

RS?? 記錄分隔符(默認是一個換行符)

NF?? 當前記錄中的字段數(shù)

NR?? 當前記錄數(shù)

OFS? 輸出字段分隔符(默認值是一個空格)

ORS? 輸出記錄分隔符(默認值是一個換行符)

?

(3) awk的函數(shù)

-字符串函數(shù)

length(string)?????????????? 求串string中的字符個數(shù)

substr(stringposition,len)? 返回一個以position開始len個字符的子串

tolower(string)????????????? 轉換為小寫字符

toupper(string)????????????? 轉換為大寫字符

match(stringreg)??????????? 返回正規(guī)表達式reg匹配的string中的位置

sub(reg,targetstring)?????? 第一次當正規(guī)表達式reg匹配,替換target串中的字符串

index(search,string)???????? 返回stringsearch串的位置

?

-時間日期函數(shù)

systime()??????????????????? 返回當前系統(tǒng)日期和時間

strftime(格式符,日期時間)??? 返回格式化后的日期和時間,strftime常用的格式符

%a? 星期幾的縮寫(Sun)

%A? 星期幾的完整寫法(Sunday)

%b? 月名的縮寫(Oct)

%B? 月名的完整寫法(October)

%c? 本地日期和時間

%d? 十進制日期

%D? 日期 08/20/99

%H? 用十進制表示24小時格式的小時

%I? 用十進制表示12小時格式的小時

%m? 十進制表示的月份

%M? 十進制表示的分鐘

%S? 十進制表示的秒

%y? 兩位數(shù)字表示的年(99)

%Y? 四位數(shù)字表示的年(9999)

?

-數(shù)學函數(shù)

int(x)?? 取整

rand()?? 隨機數(shù)

sqrt(x)? 平方根

?

5. awk的常用語句

?

(1) print

作用: 輸出指定的字符串或表達式的值

格式: print 字符串/表達式

實例: #awk -F: '{print$1}' /etc/passwd

?

(2) printf

作用: 格式化輸出指定字符串或表達式的值

格式: printf "格式符/字符串",表達式/變量

實例: #awk -F: '{printf"username:%s\n",$1}' /etc/passwd

?

-轉義字符

\t? table制表位

\n? 換行符

\\? 表示“\

\b? 表示退格

?

-格式符

%c???? 輸出單個字符

%d%i? 輸出整數(shù)

%e???? 按科學計數(shù)法輸出小數(shù)

%f???? 輸出浮點數(shù)

%s???? 輸出字符串

%%???? 輸出%

?

(3) if

作用: 實現(xiàn)條件分支

格式: if(條件表達式)

{

...

}

[else

{

...

}]

實例: #awk -F:'{if($3==0) {print $0}}' /etc/passwd

?

(4) for

作用: 實現(xiàn)循環(huán)執(zhí)行

格式:for(init_cntr;test_cntr;incr_cntr)

{

...

}

實例: #awk -F:'{for(i=1;i<5;i++) {printf "%s:"$i} print \n}'/etc/passwd

#awk -F:'{for(i=0;i<6;i++) {printf "%s:\n", $i} }' /etc/passwd

?

(5) while

作用: 實現(xiàn)循環(huán)執(zhí)行

格式: while(條件表達式)

{

...

}

實例: #awk -F:'{i=1;while(i<5) {printf "%s:",$i} print \n}'/etc/passwd

?

(6) BEGIN

作用: 定義awk在打開文件之前所執(zhí)行的操作

格式: BEGIN{

...

}

?

(7) END

作用: 定義awk在處理文件結束后所執(zhí)行的操作

格式: END{

...

}

?

(8) exit

作用: 退出awk程序

?

(9) break

作用: 退出循環(huán)

?

(10) continue

作用: 繼續(xù)下一次循環(huán)

?

(11) next

作用: 讀下一條記錄

?

(12) getline

作用: 讀取一行內(nèi)容

格式: getline [<文件名|變量名]

?

(13) close

作用: 關閉文件

格式: close(變量名/文件名)

?

5. awk的使用實例

?

(1) 編寫shell腳本和awk腳本用于格式化輸出指定網(wǎng)絡接口的MAC地址、IP地址和子網(wǎng)絡掩碼

?

#vi/shell/ak1

#!/bin/awk-f

BEGIN{

print"?????? ?????Mac&IP Address????????????? "

print"----------------------------------------"}

{

if(NR==1){

printf"Mac Address:%s\n",$5}

if(NR==2){

printf"IP Address:%s\n",substr($2,6)

printf"Net Mask:%s\n",substr($4,6)}

}

END{

print"----------------------------------------"}

#chmoda+x /shell/ak1

#vi/shell/sh2

#!/bin/bash

clear

echo -n"input device name:"

read i

?

ififconfig|grep -q "$i"

then

ifconfig$i|/shell/ak1

else

echo"$i is not active"

fi

#chmoda+x /shell/sh2

?

(2) 編寫shellawk腳本,統(tǒng)計apache指定日期的IP訪問量()

#vi/shell/ak2

#!/bin/awk-f

BEGIN{

printf"date:"

getlined<"-"??? //d為變量}

{

if(substr($4,2,11)=d){

print $1}

}

#vi/shell/sh3

#!/bin/bash

/shell/ak2/var/log/httpd/access_log|sort|uniq|wc -l //取得日志行數(shù)

#chmoda+x /shell/ak2

#chmoda+x /shell/sh3


微信掃一掃?、關注公眾號

?? 不定時分享資料視頻

bash shell基礎編程


向AI問一下細節(jié)

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

AI