循環結構 case語句 、 函數及中斷控制

read
-m keymap
Use keymap as the keymap to be affected by
the subsequent bindings. Acceptable keymap
names are emacs, emacs-standard, emacs-meta,
emacs-ctlx, vi, vi-move, vi-command, and
vi-insert. vi is equivalent to vi-command;
emacs is equivalent to emacs-standard.
-l List the names of all readline functions.
-p Display readline function names and bindings
in such a way that they can be re-read.
-P List current readline function names and
bindings.
-s Display readline key sequences bound to
macros and the strings they output in such a
way that they can be re-read.
-S Display readline key sequences bound to
macros and the strings they output.
-v Display readline variable names and values in
such a way that they can be re-read.
-V List current readline variable names and val‐
ues.
-f filename
Read key bindings from filename.
-q function
Query about which keys invoke the named func‐
tion.
-u function
Unbind all keys bound to the named function.
-r keyseq
Remove any current binding for keyseq.

##read 讀文件##
每次調用讀取文件中的“一行”,當文件沒有可讀時,read命令將以非零狀態退出。
讀取文件的關鍵是如何將文本的數據傳送給read命令。
最常用的方法是對文件使用cat命令並通過管道將結果直接傳送給包含read命令的while命令。
#!/bin/bash
count=1 //賦值語句,不加空格
cat text.sh| while read line //cat命令的輸出作爲read命令的輸入,read讀到的值放在line中

do
echo "Line $count:$line"
count=$[ $count+1 ] 注意中括號中的空格
done
echo "finish"
exit 0

##echo 顯示信息##
echo 回車後會空一行
echo -n
[root@localhost ~]# echo

[root@localhost ~]# echo -n
[root@localhost ~]#

1+2 2元運算
x++ 1元運算

循環,將某些指令重複的執行。

for語法格式【固定次數】

for 變量 in 值1 值2 值3 ...
do
命令
done

#!/bin/bash
for i in 1 2 a b c 【i在這裏是個變量】【變量的值可以被覆蓋】
do
echo $i 【讀取結果】
done

for i in a tt yy uu 22 33 【這裏的i只是表示反覆讀取的次數】
do
echo abc
done

[root@localhost ~]# ./test.sh
1
2
3
a
b
abc
abc
abc
abc
abc
abc

for i in ls 【``執行命令,提取結果】
do
命令
done

[root@localhost ~]# echo {1..20} 【產生8個數字】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
[root@localhost ~]#

[root@localhost ~]# seq 5 【生成序列】
1
2
3
4
5
[root@localhost ~]# seq 2 5
2
3
4
5
[root@localhost ~]# seq 2 5 20
2
7
12
17
[root@localhost ~]#

#!/bin/bash
for i in {1..1000} 【注意:{}沒有空格】
do
touch /tmp/$i.txt & 【&速度會提高】
done
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#!/bin/bash
for i in seq 1000
do
rm -rf /tmp/$i.txt &
done

寫腳本,將/var/log/目錄下,每個文件或目錄,單獨打包
ls /var/log

/var/log/a---->/var/log/a.tar.gz
/var/log/b---->/var/log/b.tar.gz
/var/log/c---->/var/log/c.tar.gz

tar -czf 打包後的文件名 打包對象
-c (create)
-z (gzip)
-f (file)

./test11.sh
#!/bin/bash
for i in ls /var/log/ 【ls取出的東西是沒有路徑的】
do
tar -czf /var/log/$i.tar.gz /var/log/$i &> /dev/null 【壓縮是要給路徑的!!從哪來,到哪去!】 重點:&> /dev/null
done
+++++一定要給絕對路徑,否則會讀取當前路徑++++++

for 變量 in 值1 值2 值3 ...
do
命令
done

for ((i=1;i<=5;i++))
do
echo abc
done

練習:(打印99乘法表) 需要兩個for
1
1=1
21=2 22=4
31=3 23=6 3*3=9

for i in 1..x
for j in 1..x
echo "$i$j=$[ij]"
echo -n 【not】
有的地方需要換行,有些地方不需要

for i in seq9
do
for j in j=1;j<10;j++
do
echo "$i$j=$[ij]" && j<10 || echo -n
done
done

#!/bin/bash
for i in seq 9
do
for j in seq $i 【j的值不能大於i的值】
do
echo -n "$i$j=$[ij] "
done
echo
done

需要兩個for 8行8列

echo -e "\033[31mOK\033[Om"
echo -e【擴展】 "\033【 顏色】[31【shai】mOK【內容】\033【顏色】[Om【色到哪裏】"
extend 所有內容是紅色\這個之間是紅色

while 測試
do
命令
done
當測試爲真時,執行命令,直到測試爲錯時,循環結束

i=1
while [ $i -le 5 ]
do
echo abc
let i++ //循環5次
done

for 循環次數固定的時候

while [] 循環次數,不固定的時候使用

#!/bin/bash //死循環
i=1
while [ $i -le 5 ]
do
echo $i
done

定義死循環
while : 【不固定次數】
do

done

while true
do

done

##sed -n "11p" user.txt 文件的第11行

head tail 11

wc -l user.txt

vim test.sh
while :
do
n=$[RANDOM%45+1]
sed -n "${i}p" user.txt
sleep 0.1
clear
done

i=3
while [ $i < 4 ] //僞代碼
do
命令
done

###九九乘法表####

[root@localhost ~]# vim test11.sh
#!/bin/bash
for i in seq 9
do
for j in seq $i
do
echo -n "$i$j=$[ij] "
done
echo
done

[root@localhost ~]# ./test11.sh
11=1
2
1=2 22=4
3
1=3 32=6 33=9
41=4 42=8 43=12 44=16
51=5 52=10 53=15 54=20 55=25
6
1=6 62=12 63=18 64=24 65=30 66=36
7
1=7 72=14 73=21 74=28 75=35 76=42 77=49
81=8 82=16 83=24 84=32 85=40 86=48 87=56 88=64
91=9 92=18 93=27 94=36 95=45 96=54 97=63 98=72 9*9=81

ping網段
for i in {1..254}
do
ping -c 2 192.168.4.$i &> /dev/null
if [ $? -eq 0 ];
then
echo "192.168.4.$i is up"
else
echo "192.168.4.$i is down"
let x++
fi
done

+++++++++++++++++++++++++++++++++++++++++++++++++
國際象棋棋盤

#!/bin/bash
for i in {1..8}
do
for j in {1..8}
do
if [ $[(i+j)%2] -eq 0 ] ; then
echo -en "\033[41m \033[0m"
else
echo -en "\033[47m \033[0m"
fi
done
echo
done

###批量創建用戶###

版本1
for i in {1..100}
do
useradd user$1
done

版本2
1)useradd $1
echo "$2" | passwd --stdin $1

2)read -p “請你輸入用戶名: ” num
useradd $num
read -p “請輸入密碼: ” pass
useradd $pass

版本3
vim user.txt
tom
jerry
......
++++++++++++++++++++++++++++++++++++++++++++
for i in cat user.txt
do
useradd $i
echo "123456" | passwd --stdin $i

done

+++++++++++++++++++++++++++++++++++++++++++++
[root@room4pc09 桌面]# ssh 192.168.4.1 touch /a.txt
[email protected]'s password:
[root@room4pc09 桌面]# ls /a.txt
ls: 無法訪問/a.txt: 沒有那個文件或目錄
[root@room4pc09 桌面]#

[root@localhost test]# ls /a.txt
/a.txt
[root@localhost test]#

#!/bin/bash
for i in {1..254}
do
ping -c 3 172.40.3.$i $>/dev/null
if [ $? -eq 0 ];
then
ssh 172.40.3.$i shutdown //需要免密
else

echo "172.40.3.$i is down"

fi
done

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

當用戶輸入redhat,返回fedora
當用戶輸入fedora,返回redhat
其他,返回Usage:xxx

在 system1 上創建一個名爲/root/foo.sh 的腳本,讓其提供下列特性:
當運行/root/foo.sh redhat,輸出爲 fedora
當運行/root/foo.sh fedora,輸出爲 redhat
當沒有任何參數或者參數不是 redhat 或者 fedora 時,其錯誤輸出產生以下的信息:
/root/foo.sh redhat|fedora

[root@serverX ~]# vim /root/foo.sh
#!/bin/bash
if [ "$1" = "redhat" ]
then
echo "fedora"
elif [ "$1" = "fedora" ]
then
echo "redhat"
else
echo "/root/foo.sh redhat|fedora" >&2
fi
[root@serverX ~]# chmod +x /root/foo.sh
或者
[root@serverX ~]# vim /root/foo.sh
#!/bin/bash
case "$1" in
redhat)
echo "fedora"
10 / 14
http://bj.linux.tedu.cn/達內Linux 雲計算學院
;;
fedora)
echo "redhat"
;;
*)
echo '/root/foo.sh redhat|fedora' >&2
esac
[root@serverX ~]# chmod +x /root/foo.sh

case 簡化版的if(功能比if少)

語法格式

case 變量 in //判斷變量與值1是否相等
值1)
命令
命令;;
值2) //判斷變量與值2是否相等
命令;;
*) //相當於if語句中的else
命令;;
esac

#!/bin/bash
case $1 in
redhat)
echo "fedora";;
fedora)
echo "redhat";;
*)
echo "usage:xxx"
esac

vim編輯文件
cat 查看文件
rm 刪除文件
touch 新建文件

./test.sh -v 文件 《編輯文件》
./test.sh -c 文件 《編輯文件》
./test.sh -r 文件 《編輯文件》
./test.sh -t 文件 《編輯文件》
./test.sh -h 文件 《顯示幫助Usage》

case $1 in
-v)

#!/bin/bash
case $1 in
-v)
vim $2;;
-c)
cat $2;;
-r)
rm $2;;
-t)
touch $2;;
-)
echo "Usage:test.sh [-v|-c|-r|-t|-
]filename";;
esac

read -p "請輸入點嘛:" key
case $key in
[a-Z]) //Z a-Z 的大小寫都可以識別【邏輯上的或者】 還可以寫成[a-z]|[A-Z])
echo "字母";;
[0-9])
echo "數字";;
*)
echo "符號";;
esac
+++++++++++++++++++++++++++++++++++++++++++++++
快速將vim中的所有都註釋掉:ECS,Ctrl+v,下鍵,I,#,ESC
u 在vim編輯器裏,可以撤銷上一條命令
++++++++++++++++++++++++++++++++++++++++++++++++==
[0-9][0-9] 表示兩位數

++++++++++++++++++++++++++++++++++++++++++++++

函數(避免代碼的重複)

yum install httpd
systemctl start httpd
systemctl enable httpd

語法:
1.定義函數
函數名(){
命令
命令
命令
}
2.調用函數
函數名

mkdir /test
cd /test
ls
[root@localhost test]# mymkdir (){

mkdir /txt
cd /txt
ls -lh /txt
}
[root@localhost test]# mymkdir
總用量 0
[root@localhost test]# mymkdir //不能執行兩遍,需要優化
mkdir: 無法創建目錄"/test": 文件已存在
總用量 0
[root@localhost test]#

[root@localhost ~]# mymkdir () {

mkdir $1
cd $1
ls -lh $1
}
[root@localhost ~]# mymkdir /a
總用量 0
[root@localhost a]# mymkdir /b
總用量 0
[root@localhost b]# mymkdir /hehe
總用量 0
[root@localhost hehe]#

##寫到profile裏纔是永久的。
install () {
yum -y install $1
systemctl start $1
systemctl enable $1
}

install httpd
install vsftpd
install mariadb-server

#!/bin/bash
cecho () {
echo -e "\033[$1m$2 \033[0m"
}
cecho 32 OK
cecho 32 OK
cecho 32 OK

+++++++++++++++++++++++++++++++++++++++++++

函數名稱(){
命令
命令
命令
}

vim test.sh //死機.shi得很徹底
#!/bin/bash
.(){ //定義函數名稱爲.
.|.& //調用自己管道給自己,後臺運行【核心問題在&上】
}
. //自己執行7

vim test.sh
num=who |wc -l
[ $num -gt 3 ] && mail xxx

crontab -e

          • /root/test.sh

vim test.sh
while:
do
echo a
echo b
done

結果:while死循環,不會結束。每分鐘都會執行

可以:
vim a.sh
while:
do
text.sh
done

windox 上默認沒有bash,但是可以安裝


腳本的中斷

假設i=x
for i in {1..254}
do
ssh 192.168.4.$i shutdown++

done
結果:##自己是誰## 同一個網段的纔可以ssh,如果自己是10,就把自己關掉了
腳本的目的是什麼

continue:結束本次循環,進入下一次循環。不關心時for還是while。
break:結束整個循環體
exit:結束腳本
eg:
for i in {1..5}
do
echo $i
continue //1結束直接跳到2循環....
echo a
done

for i in {1..5}
do
echo $i
break //整個循環結束...
done
echo over
1 over

for i in {1..5}
do
[ $i -eq 3 ] && [continiu|break|exit]
只有3不執行|只有1.2|1,2,然後直接退出腳本
echo $i
done
echo over

[root@localhost test]# vim duan.sh
[root@localhost test]# . duan.sh //continue
1
2
4
5
[root@localhost test]# vim duan.sh
[root@localhost test]# . duan.sh //break
1
2
[root@localhost test]# vim duan.sh
[root@localhost test]# . duan.sh //exit
1
2
Connection to 192.168.4.1 closed.
您在 /var/spool/mail/root 中有新郵件
[root@room4pc09 桌面]#

==============================================
eg:從鍵盤循環取整數(0結束)並求和,輸出最終結果
sum=0
while :
do
read -p "請輸入整數:" num
求和 let num
sum=sum+num
done

sum=0
5
sum=0+5=5
10
sum=5+10
15

vim qiuhe.sh
#!/bin/bash
sum=0
while :
do
read -p "請輸入整數:" num
[ $num -eq 0 ] && break
sum=$[sum+num]
done
echo $sum


跳過1~20以內非6的倍數,輸出其他數的平方值,設定退出代碼爲2

for i in {1..20}
do
x=$[i%6]
[ $x -ne 0 ] && continue or [ $x -eq 0 ] && continue
pf=$[i*i]
done

echo "print 2**3" | python //pri nt打印出結果。2的三次方

exit 250 //250爲退出碼。不同的碼代表不同的退出問題

1-10輸出3,6,9 的平方數(3的倍數)

在紅帽6中可以安裝bash-completion====》》》》Tab

+++++++++++++++++++++++++++++++++++++++++++++++++++
字串截取
方法一
echo ${key:0:3} //從
[root@localhost test1]# phone=18318616159
[root@localhost test1]# echo ${phone:0:3}
183
[root@localhost test1]# echo ${phone:3:6}
186161
[root@localhost test1]# echo ${phone:3:3}
186
[root@localhost test1]#

方法二
expr substr "$key" 起始位置 長度 //subway 下面的路==》地鐵
[root@localhost test1]# phone=18318616159
[root@localhost test1]# expr substr "$phone" 1 3
183
[root@localhost test1]# expr substr "$phone" 6 2
61
[root@localhost test1]# expr substr "$phone" 3 3
318
[root@localhost test1]#

方法三
echo $key | cut -b 1-5
echo $key | cut -b 1,3,5
-b=--byte
[root@localhost test1]# phone=18318616159
[root@localhost test1]# echo $phone | cut -b 1-3 //第一位到第三位
183
[root@localhost test1]# echo $phone | cut -b 3-6
3186
[root@localhost test1]# echo $phone | cut -b 1,3,16 //沒有第16位直接取空
13
[root@localhost test1]#
########
[root@localhost test1]# echo $phone | cut -b 1,3,5
138
######


vim test.sh
key='abcdefghijklmnopqrstuvwxyz'
生成六位隨機數

expr substr "$key" 隨機數%26 1

#!/bin/bash
key='abcdefjhigklmnopqrstuvwxyz'
for i in {1..6} // 6次
do
echo -n ${key:$[RANDOM]%26:1} //$[RANDOM]%26,每次循環都會取一個值。
done
echo

Top
NSD SHELL DAY03

案例1:使用for循環結構
案例2:使用while循環結構
案例3:基於case分支編寫服務腳本
案例4:使用Shell函數
案例5:中斷及退出

1 案例1:使用for循環結構
1.1 問題

本案例要求編寫一個Shell腳本chkhosts.sh,利用for循環來檢測多個主機的存活狀態,相關要求及說明如下:

待檢測的多個目標IP地址,存放在ipadds.txt文件內
ping檢測可參考前一天的pinghost.sh腳本
腳本能遍歷ping各主機,並反饋存活狀態

執行檢測腳本以後,反饋結果如圖-1所示。

圖-1
1.2 方案

在Shell腳本應用中,常見的for循環採用遍歷式、列表式的執行流程,通過指定變量從值列表中循環賦值,每次複製後執行固定的一組操作。

for循環的語法結構如下所示:

for  變量名  in  值列表
do
    命令序列
done

1.3 步驟

實現此案例需要按照如下步驟進行。

步驟一:練習for循環基本用法

腳本1,通過循環讀取賬戶文件user.txt,批量創建賬戶:

[root@svr5 ~]# vim for01.sh
#!/bin/bash
for i in $(cat root/user.txt)
do
        useradd $i
        echo "123456" | passwd --stdin $i
done
[root@svr5 ~]# chmod +x for01.sh

步驟二:批量檢測多個主機的存活狀態

1)準備工作

先確認(或建立)目標IP地址列表文件,能ping通、不能ping通的地址各添加幾個,以方便測試:

[root@svr5 ~]# vim /root/ipadds.txt
192.168.4.5
192.168.4.205
172.16.16.78
202.106.178.234

2)編寫腳本如下:
ping -c【count】 -i【interval間隔】 -W【 timeout】
[root@svr5 ~]# 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 ] ; then
echo "Host $IP is up."
else
echo "Host $IP is down."
fi
done
[root@svr5 ~]# chmod +x chkhosts.sh

3)測試、驗證腳本

[root@svr5 ~]# ./chkhosts.sh
Host 192.168.4.5 is up.
Host 192.168.4.205 is up.
Host 172.16.16.78 is down.
Host 202.106.178.234 is down.

2 案例2:使用while循環結構
2.1 問題

本案例要求編寫三個使用while循環的腳本程序,分別實現以下目標:

批量添加用戶賬號:stu1-stu20
批量刪除用戶賬號:stu1-stu20
檢測192.168.4.0/24網段,列出不在線的主機地址

2.2 方案

while循環屬於條件式的執行流程,會反覆判斷指定的測試條件,只要條件成立即執行固定的一組操作,直到條件變化爲不成立爲止。所以while循環的條件一般通過變量來進行控制,在循環體內對變量值做相應改變,以便在適當的時候退出,避免陷入死循環。

while循環的語法結構如下所示:

while  條件測試
do
    命令序列
done

2.3 步驟

實現此案例需要按照如下步驟進行。

步驟一:批量添加用戶賬號stu1-stu20

添加的賬號有固定的前綴stu(練習中可自行設置),多個賬號從1開始編號,比如stu1、stu2、stu3、……、stu20。—— 編寫腳本uaddwhile.sh,實現批量添加這20個用戶賬號的功能,密碼均設爲123456。

腳本編寫參考如下:

[root@svr5 ~]# 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++
done
[root@svr5 ~]# chmod +x uaddwhile.sh

執行腳本並驗證結果:

[root@svr5 ~]# ./uaddwhile.sh
[root@svr5 ~]# grep ^stu /etc/passwd              //檢查添加的用戶
stu1:x:531:531::/home/stu1:/bin/bash
stu2:x:532:532::/home/stu2:/bin/bash
stu3:x:533:533::/home/stu3:/bin/bash
stu4:x:534:534::/home/stu4:/bin/bash
stu5:x:535:535::/home/stu5:/bin/bash
… …

步驟二:批量刪除用戶賬號stu1-stu20

針對前面執行uaddwhile.sh腳本批量添加的用戶賬號,再建立一個批量刪除這些賬號的腳本udelwhile.sh。結構類似,只要替換爲刪除相關的操作即可。

腳本編寫參考如下:

[root@svr5 ~]# vim udelwhile.sh
#!/bin/bash
PREFIX="stu"
i=1
while [ $i -le 20 ]
do
    userdel -r ${PREFIX}$i &> /dev/null
    let i++
done
[root@svr5 ~]# chmod +x udelwhile.sh

執行腳本並驗證結果:

[root@svr5 ~]# ./udelwhile.sh
[root@svr5 ~]# grep ^stu /etc/passwd                  //再檢查已無相應賬號信息
[root@svr5 ~]#

步驟三:檢測192.168.4.0/24網段,列出不在線的主機地址

1)任務需求及思路分析

要求的是“檢測192.168.4.0/24網段,列出不在線的主機地址”。

檢測目標是一個網段,其網絡部分“192.168.4.”可以作爲固定的前綴;而主機部分包括從1~254連續的地址,所以可結合while循環和自增變量進行控制。

2)根據實現思路編寫腳本

[root@svr5 ~]# vim chknet.sh
#!/bin/bash
NET="192.168.4."
i=1
while [ $i -le 254 ]
do
    IP="${NET}$i"
    ping -c 3 -i 0.2 -W 1 $IP &> /dev/null
    if [ $? -eq 0 ] ; then
        echo "Host $IP is up."
    else
        echo "Host $IP is down."
    fi
    let i++
done
[root@svr5 ~]# chmod +x chknet.sh 

3)測試、驗證腳本

[root@svr5 ~]# ./chknet.sh
Host 192.168.4.1 is down.
Host 192.168.4.2 is down.
Host 192.168.4.3 is down.
Host 192.168.4.4 is down.
Host 192.168.4.5 is up.
.. ..
Host 192.168.4.250 is down.
Host 192.168.4.251 is down.
Host 192.168.4.252 is down.
Host 192.168.4.253 is down.
Host 192.168.4.254 is down.

3 案例3:基於case分支編寫服務腳本
3.1 問題

本案例要求編寫myhttpd服務腳本,相關要求如下:

能支持start、stop、restart等控制參數
控制參數通過位置變量$1傳入
能通過chkconfig命令來管理此服務
Apache主程序/usr/sbin/httpd

3.2 方案

case分支屬於匹配執行的方式,它針對指定的變量預先設置一個可能的取值,判斷該變量的實際取值是否與預設的某一個值相匹配,如果匹配上了,就執行相應的一組操作,如果沒有任何值能夠匹配,就執行預先設置的默認操作。

case分支的語法結構如下所示:

case  變量值  in
模式1)
    命令序列1 ;;
模式2)
    命令序列2 ;;
    .. ..
*)
    默認命令序列
Esac

Linux系統的服務腳本默認均位於/etc/init.d/目錄下,基本上都採用了case分支結構來識別控制參數。能夠執行“/etc/init.d/服務名 start”或“service 服務名 start”來啓動對應的服務,是因爲對應的腳本文件能夠處理“start”這個位置參數。
3.3 步驟

實現此案例需要按照如下步驟進行。

步驟一:編寫腳本文件

腳本編寫參考如下:

[root@svr5 ~]# vim /etc/init.d/myhttpd
#!/bin/bash
# chkconfig: 2345 90 10
# description: Startup script for http Server. (for Test only)
#!/bin/bash
case $1 in
start)
        /usr/sbin/httpd
        echo "我已經啓動了";;
stop)
        kill `cat /var/run/httpd/httpd.pid`;;   #反引號
restart)
        kill `cat /var/run/httpd/httpd.pid`
        sleep 1
        /usr/sbin/httpd;;
status)
        if [ -f /var/run/httpd/httpd.pid ];then
            echo "服務正在運行..."
        else
            echo "服務已經關閉"
        fi;;
esac
*)                                              //默認輸出腳本用法
    echo "用法: $0 {start|stop|status|restart}"
    exit 1
esac
[root@svr5 ~]# chmod +x /etc/init.d/myhttpd

步驟二:驗證、測試腳本

未提供參數,或提供的參數無法識別時,提示正確用法:

[root@svr5 ~]# /etc/init.d/myhttpd
用法: /etc/init.d/myhttpd {start|stop|status|restart}
[root@svr5 ~]# /etc/init.d/myhttpd check
用法: /etc/init.d/myhttpd {start|stop|status|restart}

確認可響應status控制參數:

[root@svr5 ~]# service myhttpd status
服務已經停止。

確認可響應start控制參數,再次檢查服務狀態:

[root@svr5 ~]# service myhttpd start
[root@svr5 ~]# service myhttpd status
服務正在運行...

確認可響應stop控制參數,再次檢查服務狀態:

[root@svr5 ~]# service myhttpd stop
[root@svr5 ~]# service myhttpd status
服務已經停止。

上述操作完成後,說明此服務腳本基本上可以使用了。

步驟三:添加myhttpd服務

通過將服務提交給chkconfig管理,方便配置在不同運行級別是否自動運行。

執行以下操作將myhttpd添加爲系統服務,並再次檢查自啓狀態:

[root@svr5 ~]# chkconfig --add httpd                  //添加myprog服務
[root@svr5 ~]# chkconfig --list httpd              //確認添加結果
myprog          0:關閉  1:關閉  2:啓用  3:啓用  4:啓用  5:啓用  6:關閉

此後,就可以使用chkconfig工具來調整myhttpd服務的自啓狀態了。比如,以下操作可以將所有自啓關閉:

[root@svr5 ~]# chkconfig myprog off                  //將自啓設爲關閉
[root@svr5 ~]# chkconfig --list httpd              //確認設置結果
myprog          0:關閉  1:關閉  2:關閉  3:關閉  4:關閉  5:關閉  6:關閉

4 案例4:使用Shell函數
4.1 問題

本案例要求編寫兩個Shell腳本,相關要求如下:

一個funexpr.sh腳本:由用戶在執行時提供2個整數值參數,計算這2個整數的加、減、乘、除結果

4.2 方案

在Shell腳本中,將一些需重複使用的操作,定義爲公共的語句塊,即可稱爲函數。通過使用函數,可以使腳本代碼更加簡潔,增強易讀性,提高Shell腳本的執行效率

1)函數的定義方法

格式1:

function  函數名 {
    命令序列
    .. ..
}

格式2:

函數名() {
    命令序列
    .. ..
}

2)函數的調用

直接使用“函數名”的形式調用,如果該函數能夠處理位置參數,則可以使用“函數名 參數1 參數2 .. ..”的形式調用。

注意:函數的定義語句必須出現在調用之前,否則無法執行。
4.3 步驟

實現此案例需要按照如下步驟進行。

步驟一:編寫funexpr.sh腳本

1)任務需求及思路分析

用戶在執行時提供2個整數參數,這個可以通過位置變量$1、$2讀入。

針對給定的兩個整數,四則運算可以視爲一組操作,可以定義爲一個函數,依次負責加減乘除運算並輸出結果。

調用函數時,將用戶提供的兩個參數傳遞給函數處理。

2)根據實現思路編寫腳本文件

[root@svr5 ~]# vim funexpr.sh
#!/bin/bash
myexpr() {
    echo "$1 + $2 = $[$1+$2]"
    echo "$1 - $2 = $[$1-$2]"
    echo "$1 * $2 = $[$1*$2]"
    echo "$1 / $2 = $[$1/$2]"
}
myexpr $1 $2
[root@svr5 ~]# chmod +x funexpr.sh

3)測試腳本執行效果

[root@svr5 ~]# ./funexpr.sh  43  21
43 + 21 = 64
43 - 21 = 22
43 * 21 = 903
43 / 21 = 2
[root@svr5 ~]# ./funexpr.sh 1234 567 
1234 + 567 = 1801
1234 - 567 = 667
1234 * 567 = 699678
1234 / 567 = 2

5 案例5:中斷及退出
5.1 問題

本案例要求編寫兩個Shell腳本,相關要求如下:

從鍵盤循環取整數(0結束)並求和,輸出最終結果
跳過1~20以內非6的倍數,輸出其他數的平方值,設定退出代碼爲2

5.2 方案

通過break、continue、exit在Shell腳本中實現中斷與退出的功能。
5.3 步驟

實現此案例需要按照如下步驟進行。

步驟一:編寫腳本sum.sh

1)編寫腳本文件

[root@svr5 ~]# vim sum.sh 
#!/bin/bash
while  read  -p  "請輸入待累加的整數(0表示結束):"     x
do
    [ $x -eq 0 ]  &&  break
    SUM=$[SUM+x]
done
echo "總和是:$SUM"
[root@svr5 ~]# chmod +x chkint.sh

步驟二:編寫sum.sh腳本文件

1)編寫腳本文件

[root@svr5 ~]# vim mysum.sh 
#!/bin/bash
i=0
while  [ $i -le 20 ]
do
    let i++
    [ $[i%6] -ne 0 ]  &&  continue
    echo $[i*i]
done
exit 2
[root@svr5 ~]# chmod +x sum.sh

##需要複習##
tar
crontab

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章