06_SHELL程式設計之CASE語句+函式+正則

菜鳥界的菜鳥發表於2020-11-16


#課程目標

  • 掌握case語句的基本語法結構
  • 掌握函式的定義及呼叫
  • 掌握常用的正規表示式元字元含義

一、case語句

關鍵詞:確認過眼神,你是對的人?

  1. case語句為多重匹配語句
  2. 如果匹配成功,執行相匹配的命令

1. 語法結構

說明:pattern表示需要匹配的模式


case var in             定義變數;var代表是變數名
pattern 1)              模式1;| 分割多個模式,相當於or
    command1            需要執行的語句
    ;;                  兩個分號代表命令結束
pattern 2)
    command2
    ;;
pattern 3)
    command3
    ;;
		  *)              default,不滿足以上模式,預設執行*)下面的語句
    command4
    ;;
esac							esac表示case語句結束

2. 應用案例

㈠ 指令碼傳不同值做不同事

**具體需求:**當給程式傳入start、stop、restart三個不同引數時分別執行相應命令

#!/bin/env bash
case $1 in
        start|S)
        service apache start &>/dev/null && echo "apache 啟動成功"
        ;;
        stop|T)
        service apache stop &>/dev/null && echo "apache 停止成功"
        ;;
        restart|R)
        service apache restart &>/dev/null && echo "apache 重啟完畢"
        ;;
        *)
        echo "請輸入要做的事情..."
        ;;
esac

㈡ 根據使用者需求選擇做事

具體需求:

指令碼提示讓使用者輸入需要管理的服務名,然後提示使用者需要對服務做什麼操作,如啟動,關閉等操作

#!/bin/env bash
read -p "請輸入你要管理的服務名稱(vsftpd):" service
case $service in
        vsftpd|ftp)
        read -p "請選擇你需要做的事情(restart|stop):" action
        case $action in
                stop|S)
                service vsftpd stop &>/dev/null && echo "該$serivce服務已經停止成功"
                ;;
                start)
                service vsftpd start &>/dev/null && echo "該$serivce服務已經成功啟動"
                ;;
        esac
        ;;
        httpd|apache)
        echo "apache hello world"
        ;;
        *)
        echo "請輸入你要管理的服務名稱(vsftpd)"
        ;;
esac
	

###㈢ 選單提示讓使用者選擇需要做的事

具體需求:

模擬一個多工維護介面;當執行程式時先顯示總選單,然後進行選擇後做相應維護監控操作

**********請選擇*********
h	顯示命令幫助
f	顯示磁碟分割槽
d	顯示磁碟掛載
m	檢視記憶體使用
u	檢視系統負載
q	退出程式
*************************

思路:

  1. 選單列印出來
  2. 互動式讓使用者輸入操作編號,然後做出相應處理

落地實現:

  1. 選單列印(分解動作)
#!/bin/env bash
cat <<-EOF
	h	顯示命令幫助
	f	顯示磁碟分割槽
	d	顯示磁碟掛載
	m	檢視記憶體使用
	u	檢視系統負載
	q	退出程式
	EOF
  1. 最終實現
#!/bin/bash
#列印選單
cat <<-EOF
	h	顯示命令幫助
	f	顯示磁碟分割槽
	d	顯示磁碟掛載
	m	檢視記憶體使用
	u	檢視系統負載
	q	退出程式
	EOF

#讓使用者輸入需要的操作
while true
do
read -p "請輸入需要操作的選項[f|d]:" var1
case $var1 in
	h)
	cat <<-EOF
        h       顯示命令幫助
        f       顯示磁碟分割槽
        d       顯示磁碟掛載
        m       檢視記憶體使用
        u       檢視系統負載
        q       退出程式
	EOF
	;;
	f)
	fdisk -l
	;;
	d)
	df -h
	;;
	m)
	free -m
	;;
	u)
	uptime
	;;
	q)
	exit
	;;
esac
done



#!/bin/bash
#列印選單
menu(){
cat <<-END
	h	顯示命令幫助
	f	顯示磁碟分割槽
	d	顯示磁碟掛載
	m	檢視記憶體使用
	u	檢視系統負載
	q	退出程式
	END
}
menu
while true
do
read -p "請輸入你的操作[h for help]:" var1
case $var1 in
	h)
	menu
	;;
	f)
	read -p "請輸入你要檢視的裝置名字[/dev/sdb]:" var2
	case $var2 in
		/dev/sda)
		fdisk -l /dev/sda
		;;
		/dev/sdb)
		fdisk -l /dev/sdb
		;;
	esac
	;;
	d)
	lsblk
	;;
	m)
	free -m
	;;
	u)
	uptime
	;;
	q)
	exit
	;;
esac
done

課堂練習:

  1. 輸入一個等級(A-E),檢視每個等級的成績;如:輸入A,則顯示“90分~100分”,依次類推
  2. 判斷使用者輸入的字串,如果是"hello",則顯示"world";如果是"world",則顯示"hello",否則提示"請輸入hello或者world,謝謝!"

二、函式

1. 什麼是函式?

  • shell中允許將一組命令集合語句形成一段可用程式碼,這些程式碼塊稱為shell函式
  • 給這段程式碼起個名字稱為函式名,後續可以直接呼叫該段程式碼的功能

2. 如何定義函式?

方法1:

函式名()
{
  函式體(一堆命令的集合,來實現某個功能)   
}

方法2:

function 函式名()
{
   函式體(一堆命令的集合,來實現某個功能)
   echo hello
   echo world
}

函式中return說明:

  1. return可以結束一個函式。類似於迴圈控制語句break(結束當前迴圈,執行迴圈體後面的程式碼)。
  2. return預設返回函式中最後一個命令狀態值,也可以給定引數值,範圍是0-256之間。
  3. 如果沒有return命令,函式將返回最後一個指令的退出狀態值。

##3. 函式如何呼叫?

㈠ 當前命令列呼叫

[root@MissHou shell04]# cat fun1.sh 
#!/bin/bash
hello(){
echo "hello lilei $1"
hostname
}
menu(){
cat <<-EOF
1. mysql
2. web
3. app
4. exit
EOF
}

[root@MissHou shell04]# source fun1.sh 
[root@MissHou shell04]# . fun1.sh 

[root@MissHou shell04]# hello 888
hello lilei 888
MissHou.itcast.cc
[root@MissHou shell04]# menu
1. mysql
2. web
3. app
4. exit

㈡ 定義到使用者的環境變數中

[root@MissHou shell05]# vim ~/.bashrc 
檔案中增加如下內容:
hello(){
echo "hello lilei $1"
hostname
}
menu(){
cat <<-EOF
1. mysql
2. web
3. app
4. exit
EOF
}

注意:
當使用者開啟bash的時候會讀取該檔案

㈢ 指令碼中呼叫

#!/bin/bash
#列印選單
source ./fun1.sh
menu(){
cat <<-END
	h	顯示命令幫助
	f	顯示磁碟分割槽
	d	顯示磁碟掛載
	m	檢視記憶體使用
	u	檢視系統負載
	q	退出程式
	END
}
menu		//呼叫函式

##4. 應用案例

具體需求:

  1. 寫一個指令碼收集使用者輸入的基本資訊(姓名,性別,年齡),如不輸入一直提示輸入
  2. 最後根據使用者的資訊輸出相對應的內容

思路:

  1. 互動式定義多個變數來儲存使用者資訊 姓名、性別、年齡

  2. 如果不輸一直提示輸入

    • 迴圈直到輸入字串不為空 while 判斷輸入字串是否為空
    • 每個資訊都必須不能為空,該功能可以定義為一個函式,方便下面指令碼呼叫
  3. 根據使用者輸入資訊做出匹配判斷

程式碼實現:

#!/bin/bash
#該函式實現使用者如果不輸入內容則一直迴圈直到使用者輸入為止,並且將使用者輸入的內容列印出來
input_fun()
{
  input_var=""
  output_var=$1
  while [ -z $input_var ]
	do
	read -p "$output_var" input_var
	done
	echo $input_var
}

input_fun 請輸入你的姓名:

或者
#!/bin/bash
fun()
{
	read -p "$1" var
	if [ -z $var ];then
		fun $1
	else
		echo $var
	fi
}


#呼叫函式並且獲取使用者的姓名、性別、年齡分別賦值給name、sex、age變數
name=$(input_fun 請輸入你的姓名:)
sex=$(input_fun 請輸入你的性別:)
age=$(input_fun 請輸入你的年齡:)

#根據使用者輸入的性別進行匹配判斷
case $sex in
			man)
			if [ $age -gt 18 -a $age -le 35 ];then
				echo "中年大叔你油膩了嗎?加油"
			elif [ $age -gt 35 ];then
				echo "保溫杯裡泡枸杞"
			else
				echo "年輕有為。。。"
			fi
			;;
			woman)
			xxx
			;;
			*)
			xxx
			;;
esac

擴充套件延伸:

描述以下程式碼含義:	
:()
{
   :|:&
}
:

#三、綜合案例

1. 任務背景

現有的跳板機雖然實現了統一入口來訪問生產伺服器,yunwei使用者許可權太大可以操作跳板機上的所有目錄檔案,存在資料被誤刪的安全隱患,所以希望你做一些安全策略來保證跳板機的正常使用。

2. 具體要求

  1. 只允許yunwei使用者通過跳板機遠端連線後臺的應用伺服器做一些維護操作
  2. 公司運維人員遠端通過yunwei使用者連線跳板機時,跳出以下選單供選擇:
歡迎使用Jumper-server,請選擇你要操作的主機:
1. DB1-Master
2. DB2-Slave
3. Web1
4. Web2
h. help
q. exit
  1. 當使用者選擇相應主機後,直接免密碼登入成功
  2. 如果使用者不輸入一直提示使用者輸入,直到使用者選擇退出

3. 綜合分析

  1. 將指令碼放到yunwei使用者家目錄裡的.bashrc檔案裡(/shell05/jumper-server.sh)
  2. 將選單定義為一個函式[列印選單],方便後面呼叫
  3. 用case語句來實現使用者的選擇【互動式定義變數】
  4. 當使用者選擇了某一臺伺服器後,進一步詢問使用者需要做的事情 case…esac 互動式定義變數
  5. 使用迴圈來實現使用者不選擇一直讓其選擇
  6. 限制使用者退出後直接關閉終端 exit

4. 落地實現

#!/bin/bash
# jumper-server
# 定義選單列印功能的函式
menu()
{
cat <<-EOF
歡迎使用Jumper-server,請選擇你要操作的主機:
1. DB1-Master
2. DB2-Slave
3. Web1
4. Web2
h. help
q. exit
	EOF
}
# 遮蔽以下訊號
trap '' 1 2 3 19
# 呼叫函式來列印選單
menu
#迴圈等待使用者選擇
while true
do
# 選單選擇,case...esac語句
read -p "請選擇你要訪問的主機:" host
case $host in
	1)
	ssh root@10.1.1.1
	;;
	2)
	ssh root@10.1.1.2
	;;
	3)
	ssh root@10.1.1.3
	;;
	h)
	clear;menu
	;;
	q)
	exit
	;;
esac
done


將指令碼放到yunwei使用者家目錄裡的.bashrc裡執行:
bash ~/jumper-server.sh
exit

進一步完善需求

為了進一步增強跳板機的安全性,工作人員通過跳板機訪問生產環境,但是不能在跳板機上停留。

#!/bin/bash
#公鑰推送成功
trap '' 1 2 3 19
#列印選單使用者選擇
menu(){
cat <<-EOF
歡迎使用Jumper-server,請選擇你要操作的主機:
1. DB1-Master
2. DB2-Slave
3. Web1
4. Web2
h. help
q. exit
EOF
}

#呼叫函式來列印選單
menu
while true
do
read -p "請輸入你要選擇的主機[h for help]:" host

#通過case語句來匹配使用者所輸入的主機
case $host in
	1|DB1)
	ssh root@10.1.1.1
	;;
	2|DB2)
	ssh root@10.1.1.2
	;;
	3|web1)
	ssh root@10.1.1.250
	;;
	h|help)
	clear;menu
	;;
	q|quit)
	exit
	;;
esac
done

自己完善功能:
1. 使用者選擇主機後,需要事先推送公鑰;如何判斷公鑰是否已推
2. 比如選擇web1時,再次提示需要做的操作,比如:
clean log
重啟服務
kill某個程式

回顧訊號:

1) SIGHUP 			重新載入配置    
2) SIGINT			鍵盤中斷^C
3) SIGQUIT      	鍵盤退出
9) SIGKILL		 	強制終止
15) SIGTERM	    	終止(正常結束),預設訊號
18) SIGCONT	   	繼續
19) SIGSTOP	   	停止
20) SIGTSTP     	暫停^Z

四、正規表示式

##1. 正規表示式是什麼?

正規表示式(Regular Expression、regex或regexp,縮寫為RE),也譯為正規表示法、常規表示法,是一種字元模式,用於在查詢過程中匹配指定的字元

許多程式設計語言都支援利用正規表示式進行字串操作。例如,在Perl中就內建了一個功能強大的正規表示式引擎。

正規表示式這個概念最初是由Unix中的工具軟體(例如sed和grep)普及開的。

支援正規表示式的程式如:locate |find| vim| grep| sed |awk

2. 正則能幹什麼?

  1. 匹配郵箱、匹配身份證號碼、手機號、銀行卡號等
  2. 匹配某些特定字串,做特定處理等等

3. 正則當中名詞解釋

  • 元字元

    指那些在正規表示式中具有特殊意義的專用字元,如:點(.) 星(*) 問號(?)等

  • 前導字元

    位於元字元前面的字元. ab**c*** aoo**o.**

##4. 第一類正規表示式

㈠ 正則中普通常用的元字元

元字元功能備註
.匹配除了換行符以外的任意單個字元
*前導字元出現0次或連續多次
.*任意長度字元ab.*
^行首(以…開頭)^root
$行尾(以…結尾)bash$
^$空行
[]匹配括號裡任意單個字元或一組單個字元[abc]
[^]匹配不包含括號裡任一單個字元或一組單個字元[^abc]
1匹配以括號裡任意單個字元或一組單個字元開頭2
^[^]匹配不以括號裡任意單個字元或一組單個字元開頭^[^abc]
  • 示例文字
# cat 1.txt
ggle
gogle
google
gooogle
goooooogle
gooooooogle
taobao.com
taotaobaobao.com

jingdong.com
dingdingdongdong.com
10.1.1.1
Adfjd8789JHfdsdf/
a87fdjfkdLKJK
7kdjfd989KJK;
bSKJjkksdjf878.
cidufKJHJ6576,

hello world
helloworld yourself
  • 舉例說明

㈡ 正則中其他常用元字元

元字元功能備註
\<取單詞的頭
\>取單詞的尾
\< \>精確匹配
\{n\}匹配前導字元連續出現n次
\{n,\}匹配前導字元至少出現n次
\{n,m\}匹配前導字元出現n次與m次之間
\( \)儲存被匹配的字元
\d匹配數字(grep -P[0-9]
\w匹配字母數字下劃線(grep -P[a-zA-Z0-9_]
\s匹配空格、製表符、換頁符(grep -P[\t\r\n]

舉例說明:

需求:將10.1.1.1替換成10.1.1.254

1)vim編輯器支援正規表示式
# vim 1.txt
:%s#\(10.1.1\).1#\1.254#g 
:%s/\(10.1.1\).1/\1.254/g 

2)sed支援正規表示式【後面學】
# sed -n 's#\(10.1.1\).1#\1.254#p' 1.txt
10.1.1.254

說明:
找出含有10.1.1的行,同時保留10.1.1並標記為標籤1,之後可以使用\1來引用它。
最多可以定義9個標籤,從左邊開始編號,最左邊的是第一個。


需求:將helloworld yourself 換成hellolilei myself

# vim 1.txt
:%s#\(hello\)world your\(self\)#\1lilei my\2#g

# sed -n 's/\(hello\)world your\(self\)/\1lilei my\2/p' 1.txt 
hellolilei myself

# sed -n 's/helloworld yourself/hellolilei myself/p' 1.txt 
hellolilei myself
# sed -n 's/\(hello\)world your\(self\)/\1lilei my\2/p' 1.txt 
hellolilei myself

Perl內建正則:
\d      匹配數字  [0-9]
\w      匹配字母數字下劃線[a-zA-Z0-9_]
\s      匹配空格、製表符、換頁符[\t\r\n]

# grep -P '\d' 1.txt
# grep -P '\w' 2.txt
# grep -P '\s' 3.txt

㈢ 擴充套件類正則常用元字元

醜話說在前面:

我說我比較特殊,你要相信!否則我錯給你看?

  • grep你要用我,必須加 -E 或者 讓你兄弟egrep來找我

  • sed你要用我,必須加 -r

擴充套件元字元功能備註
+匹配一個或多個前導字元bo+ 匹配boo、 bo
?匹配零個或一個前導字元bo? 匹配b、 bo
|匹配a或b
()組字元(看成整體)(my|your)self:表示匹配myself或匹配yourself
{n}前導字元重複n次
{n,}前導字元重複至少n次
{n,m}前導字元重複n到m次

舉例說明:

# grep "root|ftp|adm" /etc/passwd
# egrep "root|ftp|adm" /etc/passwd
# grep -E "root|ftp|adm" /etc/passwd

# grep -E 'o+gle' test.txt 
# grep -E 'o?gle' test.txt 

# egrep 'go{2,}' 1.txt
# egrep '(my|your)self' 1.txt


使用正則過濾出檔案中的IP地址:
# grep '[0-9]\{2\}\.[0-9]\{1\}\.[0-9]\{1\}\.[0-9]\{1\}' 1.txt 
10.1.1.1
# grep '[0-9]{2}\.[0-9]{1}\.[0-9]{1}\.[0-9]{1}' 1.txt 
# grep -E '[0-9]{2}\.[0-9]{1}\.[0-9]{1}\.[0-9]{1}' 1.txt 
10.1.1.1
# grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' 1.txt 
10.1.1.1
# grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}' 1.txt 
10.1.1.1

##5. 第二類正則

表示式功能示例
[:alnum:]字母與數字字元[[:alnum:]]+
[:alpha:]字母字元(包括大小寫字母)[[:alpha:]]{4}
[:blank:]空格與製表符[[:blank:]]*
[:digit:]數字[[:digit:]]?
[:lower:]小寫字母[[:lower:]]{4,}
[:upper:]大寫字母[[:upper:]]+
[:punct:]標點符號[[:punct:]]
[:space:]包括換行符,回車等在內的所有空白[[:space:]]+
[root@server shell05]# grep -E '^[[:digit:]]+' 1.txt
[root@server shell05]# grep -E '^[^[:digit:]]+' 1.txt
[root@server shell05]# grep -E '[[:lower:]]{4,}' 1.txt

6. 正規表示式總結

把握一個原則,讓你輕鬆搞定可惡的正則符號:

  1. 我要找什麼?
    • 找數字 [0-9]
    • 找字母 [a-zA-Z]
    • 找標點符號 [[:punct:]]
  2. 我要如何找?看心情找
    • 以什麼為首 ^key
    • 以什麼結尾 key$
    • 包含什麼或不包含什麼 [abc] ^[abc] [^abc] ^[^abc]
  3. 我要找多少呀?
    • 找前導字元出現0次或連續多次 ab==*==
    • 找任意單個(一次)字元 ab==.==
    • 找任意字元 ab==.*==
    • 找前導字元連續出現幾次 {n} {n,m} {n,}
    • 找前導字元出現1次或多次 go==+==
    • 找前到字元出現0次或1次 go==?==

五、正則元字元一欄表

元字元:在正則中,具有特殊意義的專用字元,如: 星號(*)、加號(+)等

前導字元:元字元前面的字元叫前導字元

元字元功能示例
*前導字元出現0次或者連續多次ab* abbbb
.除了換行符以外,任意單個字元ab. ab8 abu
.*任意長度的字元ab.* adfdfdf
[]括號裡的任意單個字元或一組單個字元[abc][0-9][a-z]
[^]不匹配括號裡的任意單個字元或一組單個字元[^abc]
3匹配以括號裡的任意單個字元開頭4
^[^]不匹配以括號裡的任意單個字元開頭
^行的開頭^root
$行的結尾bash$
^$空行
\{n\}和{n}前導字元連續出現n次[0-9]\{3\}
\{n,\}和{n,}前導字元至少出現n次[a-z]{4,}
\{n,m\}和{n,m}前導字元連續出現n-m次go{2,4}
\<\>精確匹配單詞\<hello\>
\(\)保留匹配到的字元\(hello\)
+前導字元出現1次或者多次[0-9]+
?前導字元出現0次或者1次go?
|^root|^ftp
()組字元(hello|world)123
\dperl內建正則grep -P \d+
\w匹配字母數字下劃線

六、正則練習作業

1. 檔案準備

# vim test.txt 
Aieur45869Root0000
9h847RkjfkIIIhello
rootHllow88000dfjj
8ikuioerhfhupliooking
hello world
192.168.0.254
welcome to uplooking.
abcderfkdjfkdtest
rlllA899kdfkdfj
iiiA848890ldkfjdkfj
abc
12345678908374
123456@qq.com
123456@163.com
abcdefg@itcast.com23ed

2. 具體要求

1、查詢不以大寫字母開頭的行(三種寫法)。
grep '^[^A-Z]' 2.txt
grep -v '^[A-Z]' 2.txt
grep '^[^[:upper:]]' 2.txt
2、查詢有數字的行(兩種寫法)
grep '[0-9]' 2.txt
grep -P '\d' 2.txt
3、查詢一個數字和一個字母連起來的
grep -E '[0-9][a-zA-Z]|[a-zA-Z][0-9]' 2.txt
4、查詢不以r開頭的行
grep -v '^r' 2.txt
grep '^[^r]' 2.txt
5、查詢以數字開頭的
grep '^[0-9]' 2.txt
6、查詢以大寫字母開頭的
grep '^[A-Z]' 2.txt
7、查詢以小寫字母開頭的
grep '^[a-z]' 2.txt
8、查詢以點結束的
grep '\.$' 2.txt
9、去掉空行
grep -v '^$' 2.txt
10、查詢完全匹配abc的行
grep '\<abc\>' 2.txt
11、查詢A後有三個數字的行
grep -E 'A[0-9]{3}' 2.txt
grep  'A[0-9]\{3\}' 2.txt
12、統計root在/etc/passwd裡出現了幾次
grep -o 'root' 1.txt |wc -l

13、用正規表示式找出自己的IP地址、廣播地址、子網掩碼
ifconfig eth0|grep Bcast|grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'
ifconfig eth0|grep Bcast| grep -E -o '([0-9]{1,3}.){3}[0-9]{1,3}'
ifconfig eth0|grep Bcast| grep -P -o '\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}'
ifconfig eth0|grep Bcast| grep -P -o '(\d{1,3}.){3}\d{1,3}'
ifconfig eth0|grep Bcast| grep -P -o '(\d+.){3}\d+'

# egrep --color '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /etc/sysconfig/network-scripts/ifcfg-eth0
IPADDR=10.1.1.1
NETMASK=255.255.255.0
GATEWAY=10.1.1.254

# egrep --color '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' /etc/sysconfig/network-scripts/ifcfg-eth0 
IPADDR=10.1.1.1
NETMASK=255.255.255.0
GATEWAY=10.1.1.254


14、找出檔案中的ip地址並且列印替換成172.16.2.254
grep -o -E '([0-9]{1,3}\.){3}[0-9]{1,3}' 1.txt |sed -n 's/192.168.0.\(254\)/172.16.2.\1/p'

15、找出檔案中的ip地址
grep -o -E '([0-9]{1,3}\.){3}[0-9]{1,3}' 1.txt

16、找出全部是數字的行
grep -E '^[0-9]+$' test
17、找出郵箱地址
grep -E '^[0-9]+@[a-z0-9]+\.[a-z]+$'


grep --help:
匹配模式選擇:
Regexp selection and interpretation:
  -E, --extended-regexp     擴充套件正則
  -G, --basic-regexp        基本正則
  -P, --perl-regexp         呼叫perl的正則
  -e, --regexp=PATTERN      use PATTERN for matching
  -f, --file=FILE           obtain PATTERN from FILE
  -i, --ignore-case         忽略大小寫
  -w, --word-regexp         匹配整個單詞
  

#七、課後作業

指令碼搭建web服務

要求如下

  1. 使用者輸入web伺服器的IP、域名以及資料根目錄
  2. 如果使用者不輸入則一直提示輸入,直到輸入為止
  3. 當訪問www.test.cc時可以訪問到資料根目錄裡的首頁檔案“this is test page”

參考指令碼:

參考:
#!/bin/bash
conf=/etc/httpd/conf/httpd.conf
input_fun()
{
  input_var=""
  output_var=$1
  while [ -z $input_var ]
	do
	read -p "$output_var" input_var
	done
	echo $input_var
}
ipaddr=$(input_fun "Input Host ip[192.168.0.1]:")
web_host_name=$(input_fun "Input VirtualHostName [www.test.cc]:")
root_dir=$(input_fun "Input host Documentroot dir:[/var/www/html]:")

[ ! -d $root_dir ] && mkdir -p $root_dir
chown apache.apache $root_dir && chmod 755 $root_dir
echo this is $web_host_name > $root_dir/index.html
echo "$ipaddr $web_host_name" >> /etc/hosts

[ -f $conf ] && cat >> $conf <<end
NameVirtualHost $ipaddr:80
<VirtualHost $ipaddr:80>
	ServerAdmin webmaster@$web_host_name
	DocumentRoot $root_dir
	ServerName $web_host_name
	ErrorLog logs/$web_host_name-error_log
	CustomLog logs/$web_host_name-access_loh common
</VirtualHost>
end

  1. ↩︎

  2. abc ↩︎

  3. ↩︎

  4. abc ↩︎

相關文章