条件判断式(if .... then)和netstat(介绍)和function

单层、简单条件判断式

if [ 条件判断式 ]; then
当条件判断式成立时,可以进行的指令工作内容;
fi<==if 反过来写,就成为 fi!结束 if 之意!
  • && 代表 AND ;
  • || 代表 or ;
[ "${yn}" == "Y" -o "${yn}" == "y" ]
上式可替换为
[ "${yn}" == "Y" ] || [ "${yn}" == "y" ]
#!/bin/bash
# Program:
#		This program shows the user's choice
# History:
# 		2015/07/16	VBird	First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -p "Please input (Y/N): " yn
if [ "${yn}" == "Y" ] || [ "${yn}" == "y" ]; then
echo "OK, continue"
exit 0
fi
if [ "${yn}" == "N" ] || [ "${yn}" == "n" ]; then
echo "Oh, interrupt!"
exit 0
fi
echo "I don't know what your choice is" && exit 0

多重、复杂条件判断式

# 一个条件判断,分成功进行与失败进行 (else)
if [ 条件判断式 ]; then
当条件判断式成立时,可以进行的指令工作内容;
else
当条件判断式不成立时,可以进行的指令工作内容;
fi

如果考虑更复杂的情况,则可以使用这个语法:

# 多个条件判断 (if ... elif ... elif ... else) 分多种不同情况执行
if [ 条件判断式一 ]; then
当条件判断式一成立时,可以进行的指令工作内容;
elif [ 条件判断式二 ]; then
当条件判断式二成立时,可以进行的指令工作内容;
else
当条件判断式一与二均不成立时,可以进行的指令工作内容;
fi

his program shows the user’s choice例子

#!/bin/bash
# Program:
#	This program shows the user's choice
# History:
# 	2015/07/16	VBird	First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -p "Please input (Y/N): " yn
if [ "${yn}" == "Y" ] || [ "${yn}" == "y" ]; then
echo "OK, continue"
elif [ "${yn}" == "N" ] || [ "${yn}" == "n" ]; then
echo "Oh, interrupt!"
else
echo "I don't know what your choice is"
fi

一般来说,如果你不希望用户由键盘输入额外的
数据时, 可以使用上一节提到的参数功能 ($1)!让用户在下达指令时就将参数带进去!

Check $1 is equal to "hello"例子

  1. 判断 $1 是否为 hello,如果是的话,就显示 “Hello, how are you ?”;
  2. 如果没有加任何参数,就提示使用者必须要使用的参数下达法;
  3. 而如果加入的参数不是 hello ,就提醒使用者仅能使用 hello 为参数。
#!/bin/bash
# Program:
#
Check $1 is equal to "hello"
# History:
# 2015/07/16
VBird
First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
if [ "${1}" == "hello" ]; then
echo "Hello, how are you ?"
elif [ "${1}" == "" ]; then
echo "You MUST input parameters, ex> {
    
    ${0} someword}"
else
echo "The only parameter is 'hello', ex> {
    
    ${0} hello}"
fi

netstat

[dmtsai@study ~]$ netstat -tuln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 	0 	0 		0.0.0.0:22 		0.0.0.0:* 	LISTEN
tcp 	0	0 		127.0.0.1:25 	0.0.0.0:* 	LISTEN
tcp6	0 	0 		:::22 			:::* 		LISTEN
tcp6 	0 	0 		::1:25 			:::* 		LISTEN
udp 	0 	0 		0.0.0.0:123 	0.0.0.0:* 
udp 	0 	0 		0.0.0.0:5353 	0.0.0.0:* 
udp 	0 	0 		0.0.0.0:44326 	0.0.0.0:* 
udp 	0 	0 		127.0.0.1:323 	0.0.0.0:* 
udp6 	0 	0 		:::123 			:::* 
udp6 	0 	0 		::1:323 		:::*
#封包格式			本地 IP:埠口	远程 IP:埠口是否监听

上面的重点是『Local Address (本地主机的 IP 与端口口对应)』那个字段,他代表的是本机所启动的网络服务! IP 的部分说明的是该服务位于那个接口上,若为 127.0.0.1 则是仅针对本机开放,若是0.0.0.0 或 ::: 则代表对整个 Internet 开放 (更多信息请参考服务器架设篇的介绍)。 每个埠口 (port)都有其特定的网络服务几个常见的 port 与相关网络服务的关系是:

  • 80: WWW
  • 22: ssh
  • 21: ftp
  • 25: mail
  • 111: RPC(远程过程调用)
  • 631: CUPS(打印服务功能)

netstat例子

假设我的主机有兴趣要侦测的是比较常见的 port 21, 22, 25 及 80 时,那我如何透过 netstat 去侦测我的主机是否有开启这四个主要的网络服务端口口呢?由于每个服务的关键词都是接在冒号『 : 』后面, 所以可以藉由撷取类似『 :80 』来侦测的!那我就可以简单的这样去写这个程序喔:

#!/bin/bash
# Program:
#		Using netstat and grep to detect WWW,SSH,FTP and Mail services.
# History:
# 2015/07/16
VBird
First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
# 1. 先作一些告知的动作而已~
echo "Now, I will detect your Linux server's services!"
echo -e "The www, ftp, ssh, and mail(smtp) will be detect! \n"
# 2. 开始进行一些测试的工作,并且也输出一些信息啰!
testfile=/dev/shm/netstat_checking.txt
netstat -tuln > ${testfile} # 先转存数据到内存当中!不用一直执行 netstat
testing=$(grep ":80 " ${
     
     testfile}) # 侦测看 port 80 在否?
if [ "${testing}" != "" ]; then
echo "WWW is running in your system."
fi
testing=$(grep ":22 " ${
     
     testfile})
# 侦测看 port 22 在否?
if [ "${testing}" != "" ]; then
echo "SSH is running in your system."
fi
testing=$(grep ":21 " ${
     
     testfile})
# 侦测看 port 21 在否?
if [ "${testing}" != "" ]; then
echo "FTP is running in your system."
fi
testing=$(grep ":25 " ${
     
     testfile})
# 侦测看 port 25 在否?
if [ "${testing}" != "" ]; then
echo "Mail is running in your system."
fi

生日计算例子

case … esac

case $变量名称 in <==关键词为 case ,还有变数前有钱字号
 "第一个变量内容") <==每个变量内容建议用双引号括起来,关键词则为小括号 )
 		程序段
		;;		<==每个类别结尾使用两个连续的分号来处理!
 "第二个变量内容")
		程序段
		;;
	*)			<==最后一个变量内容都会用 * 来代表所有其他值
		不包含第一个变量内容与第二个变量内容的其他程序执行段
		exit 1
		;;
 esac			<==最终的 case 结尾!『反过来写』思考一下!

直接下达式:hello 例子

#!/bin/bash
# Program:
#
Show "Hello" from $1.... by using case .... esac
# History:
# 2015/07/16
VBird
First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
case ${1} in
"hello")
echo "Hello, how are you ?"
;;
"")
echo "You MUST input parameters, ex> {
    
    ${0} someword}"
;;
*)
# 其实就相当于通配符,0~无穷多个任意字符之意!
echo "Usage ${0} {hello}"
;;
esac

一般来说,使用『 case $变量 in 』这个语法中,当中的那个『 $变量 』大致有两种取得的方式:

  • 直接下达式:例如上面提到的,利用『 script.sh variable 』 的方式来直接给予 $1 这个变量的内容,这也是在 /etc/init.d 目录下大多数程序的设计方式。
  • 交互式:透过 read 这个指令来让用户输入变量的内容。

交互式:show123例子

#!/bin/bash
# Program:
#
This script only accepts the flowing parameter: one, two or three.
# History:
# 2015/07/17
VBird
First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo "This program will print your selection !"
# read -p "Input your choice: " choice # 暂时取消,可以替换!
# case ${choice} in # 暂时取消,可以替换!
case ${1} in # 现在使用,可以用上面两行替换!
"one")
echo "Your choice is ONE"
;;
"two")
echo "Your choice is TWO"
;;"three")
echo "Your choice is THREE"
;;
*)
echo "Usage ${0} {one|two|three}"
;;
esac

函数function

function fname() {
    
    
程序段
}

因为 shell script 的执行方式是由上而下,由左而右, 因此在 shell script 当中的 function 的设定一定要在程序的最前面

#!/bin/bash
# Program:
#
Use function to repeat information.
# History:
# 2015/07/17
VBird
First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
function printit(){
    
    
echo -n "Your choice is " # 加上 -n 可以不断行继续在同一行显示
}
echo "This program will print your selection !"
case ${1} in
"one")
printit; echo ${1} | tr 'a-z' 'A-Z'
# 将参数做大小写转换!
;;
"two")
printit; echo ${1} | tr 'a-z' 'A-Z'
;;
"three")
printit; echo ${1} | tr 'a-z' 'A-Z'
;;
*)
echo "Usage ${0} {one|two|three}"
;;
esac

function 也是拥有内建变量的~他的内建变量与 shell script 很类似, 函数名称代表示 $0 ,而后续接的变量也是以 $1, $2… 来取代的这里很容易搞错喔~因为『 function fname() { 程序段 } 』内的 $0, $1… 等等与 shell script 的 $0 是不同的。以上面 show123-2.sh 来说,假如我下达:『 sh show123-2.sh one 』 这表示在 shell script 内的 $1 为 “one” 这个字符串。但是在 printit() 内的 $1 则与这个 one 无关。

#!/bin/bash
# Program:
#
Use function to repeat information.
# History:
# 2015/07/17
VBird
First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
function printit(){
    
    
echo "Your choice is ${1}"
# 这个 $1 必须要参考底下指令的下达
}
echo "This program will print your selection !"
case ${1} in
"one")
printit 1
# 请注意, printit 指令后面还有接参数!
;;
"two")
printit 2
;;
"three")
printit 3
;;
*)
echo "Usage ${0} {one|two|three}"
;;
esac

在上面的例子当中,如果你输入『 sh show123-3.sh one 』就会出现『 Your choice is 1 』的字样~ 为什么是 1 呢?因为在程序段落当中,我们是写了『 printit 1 』那个 1 就会成为 function 当中的 $1喔~ 这样是否理解呢? function 本身其实比较困难一点,如果你还想要进行其他的撰写的话。 不过,我们仅是想要更加了解 shell script 而已,所以,这里看看即可

猜你喜欢

转载自blog.csdn.net/qq_52835624/article/details/119174937