循環結構 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.python

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

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

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

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

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

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

for語法格式【固定次數】ide

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
root@192.168.4.1'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開始編號,好比stu一、stu二、stu三、……、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個整數參數,這個能夠經過位置變量$一、$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

##須要複習##tarcrontab

相關文章
相關標籤/搜索