06_SHELL程式設計之CASE語句+函式+正則
文章目錄
#課程目標
- 掌握case語句的基本語法結構
- 掌握函式的定義及呼叫
- 掌握常用的正規表示式元字元含義
一、case語句
關鍵詞:確認過眼神,你是對的人?
- case語句為多重匹配語句
- 如果匹配成功,執行相匹配的命令
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 退出程式
*************************
思路:
- 選單列印出來
- 互動式讓使用者輸入操作編號,然後做出相應處理
落地實現:
- 選單列印(分解動作)
#!/bin/env bash
cat <<-EOF
h 顯示命令幫助
f 顯示磁碟分割槽
d 顯示磁碟掛載
m 檢視記憶體使用
u 檢視系統負載
q 退出程式
EOF
- 最終實現
#!/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
課堂練習:
- 輸入一個等級(A-E),檢視每個等級的成績;如:輸入A,則顯示“90分~100分”,依次類推
- 判斷使用者輸入的字串,如果是"hello",則顯示"world";如果是"world",則顯示"hello",否則提示"請輸入hello或者world,謝謝!"
二、函式
1. 什麼是函式?
- shell中允許將一組命令集合或語句形成一段可用程式碼,這些程式碼塊稱為shell函式
- 給這段程式碼起個名字稱為函式名,後續可以直接呼叫該段程式碼的功能
2. 如何定義函式?
方法1:
函式名()
{
函式體(一堆命令的集合,來實現某個功能)
}
方法2:
function 函式名()
{
函式體(一堆命令的集合,來實現某個功能)
echo hello
echo world
}
函式中return說明:
- return可以結束一個函式。類似於迴圈控制語句break(結束當前迴圈,執行迴圈體後面的程式碼)。
- return預設返回函式中最後一個命令狀態值,也可以給定引數值,範圍是0-256之間。
- 如果沒有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. 應用案例
具體需求:
- 寫一個指令碼收集使用者輸入的基本資訊(姓名,性別,年齡),如不輸入一直提示輸入
- 最後根據使用者的資訊輸出相對應的內容
思路:
-
互動式定義多個變數來儲存使用者資訊 姓名、性別、年齡
-
如果不輸一直提示輸入
- 迴圈直到輸入字串不為空 while 判斷輸入字串是否為空
- 每個資訊都必須不能為空,該功能可以定義為一個函式,方便下面指令碼呼叫
-
根據使用者輸入資訊做出匹配判斷
程式碼實現:
#!/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. 具體要求
- 只允許yunwei使用者通過跳板機遠端連線後臺的應用伺服器做一些維護操作
- 公司運維人員遠端通過yunwei使用者連線跳板機時,跳出以下選單供選擇:
歡迎使用Jumper-server,請選擇你要操作的主機:
1. DB1-Master
2. DB2-Slave
3. Web1
4. Web2
h. help
q. exit
- 當使用者選擇相應主機後,直接免密碼登入成功
- 如果使用者不輸入一直提示使用者輸入,直到使用者選擇退出
3. 綜合分析
- 將指令碼放到yunwei使用者家目錄裡的.bashrc檔案裡(/shell05/jumper-server.sh)
- 將選單定義為一個函式[列印選單],方便後面呼叫
- 用case語句來實現使用者的選擇【互動式定義變數】
- 當使用者選擇了某一臺伺服器後,進一步詢問使用者需要做的事情 case…esac 互動式定義變數
- 使用迴圈來實現使用者不選擇一直讓其選擇
- 限制使用者退出後直接關閉終端 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. 正則能幹什麼?
- 匹配郵箱、匹配身份證號碼、手機號、銀行卡號等
- 匹配某些特定字串,做特定處理等等
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. 正規表示式總結
把握一個原則,讓你輕鬆搞定可惡的正則符號:
- 我要找什麼?
- 找數字 [0-9]
- 找字母 [a-zA-Z]
- 找標點符號 [[:punct:]]
- 我要如何找?看心情找
- 以什麼為首 ^key
- 以什麼結尾 key$
- 包含什麼或不包含什麼 [abc] ^[abc] [^abc] ^[^abc]
- 我要找多少呀?
- 找前導字元出現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 |
\d | perl內建正則 | 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服務
要求如下:
- 使用者輸入web伺服器的IP、域名以及資料根目錄
- 如果使用者不輸入則一直提示輸入,直到輸入為止
- 當訪問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
相關文章
- 03 shell程式設計之case語句與函式程式設計函式
- python之正則函式Python函式
- JavaScript函數語言程式設計之pointfree與宣告式程式設計JavaScript函數程式設計
- shell程式設計之條件語句程式設計
- case when 語句
- 好程式設計師Python培訓分享函數語言程式設計之匿名函式程式設計師Python函數函式
- JavaScript函數語言程式設計,真香之組合函式(二)JavaScript函數程式設計函式
- JavaScript函數語言程式設計之深入理解純函式JavaScript函數程式設計函式
- 程式設計正規化 —— 函數語言程式設計入門程式設計函數
- 開心檔之Java switch case 語句Java
- python函數語言程式設計之yield表示式形式Python函數程式設計
- 函數語言程式設計-鏈式程式設計RAC函數程式設計
- 02 shell程式設計之條件語句程式設計
- 04 shell程式設計之迴圈語句程式設計
- 瞭解 JavaScript 函數語言程式設計 - 宣告式函式JavaScript函數程式設計函式
- Python 函數語言程式設計 – 高階函式Python函數程式設計函式
- Python函數語言程式設計自帶函式Python函數程式設計函式
- 05 shell程式設計之正規表示式程式設計
- Qt Creator程式設計之正規表示式QT程式設計
- 函數語言程式設計:Lambda 表示式函數程式設計
- 反對函數語言程式設計的政治正確函數程式設計
- 函式程式設計函式程式設計
- sql 正則替換資料庫語句!SQL資料庫
- Lambda表示式入門--函數語言程式設計與函式式介面函數程式設計函式
- JAVA基礎--Switch case語句Java
- java中的switch case語句Java
- 條件判斷語句 if case
- Python函數語言程式設計-高階函式、匿名函式、裝飾器、偏函式Python函數程式設計函式
- 從函數語言程式設計到Ramda函式庫(一)函數程式設計函式
- JavaScript函數語言程式設計之副作用JavaScript函數程式設計
- Python學習之函數語言程式設計Python函數程式設計
- 好程式設計師分享MyBatis之動態SQL語句程式設計師MyBatisSQL
- Java語言程式設計—迴圈語句Java程式設計
- Java中的函數語言程式設計(二)函式式介面Functional InterfaceJava函數程式設計函式Function
- 鮑勃大叔:SOLID原則適合函式程式設計嗎?Solid函式程式設計
- JavaScript函數語言程式設計(純函式、柯里化以及組合函式)JavaScript函數程式設計函式
- js正規表示式驗證URL函式程式碼(方便多個正則對比)JS函式
- python程式設計之slice與indices函式用法Python程式設計函式