shell脚本编程的执行语句

顺序执行

    从上到下逐条执行命令,执行完所有命令及退出。



选择执行    

(1)&&,||

    &&:代表and,&&左侧为真右侧则执行

    ||:代表or,||左侧为假右侧则执


(2)if语句

    代码有一个分支;条件满足时才会执行;两个或以上的分支;只会执行其中一个满足条件的分支;

    单分支的if语句

if 测试条件;then

    代码分支

fi 


 双分支的if语句:

if 测试条件;then

条件为真时执行的分支

else

条件为假时执行的分支

fi

      示例:通过参数传递一个用户名给脚本,此用户不存在,则添加之

#!/bin/bash
#
#
[ $# -eq 0 ] && echo "enter username" && exit 1
if id $1 &> /dev/null;then
     echo "the is username exists"
     exit 2
 
     else
         useradd $1 && echo "useradd finish"
 fi

    多分支的if语句

if condition1;then

条件1为真分支;

elif condition2;then

条件2为真分支

elif condition3;then

条件3为真分支

elif conditionN;then

条件n为真分支

else

所有条件均不满足时的分组

fi

注意:即便多个条件可能同时都能满足,分支只会执行其中一个,首先测试为“真”的那个;

        示例:脚本参数传递一个文件路径给脚本,判断此文件的类型;

#!/bin/bash
#
#
if [ $# -lt 1 ];then
	echo "enter one filepath"
	exit 1
fi
if [ -L $1 ];then
	echo "symbolic link"
	elif
		[ -d $1 ];then
		echo "Directory"
	elif
		[ -b $1 ];then
		echo "block device file"
	elif
		[ -c $1 ];then
		echo "character special file"
	elif
		[ -f $1 ];then
		echo "Common file"
	elif
		[ -p $1 ];then
		echo "pipe"
	elif
		[ -S $1 ];then
		echo "Socket file"
	else
		echo "Alien"
fi

    注意:-L判断软连接需要写在判断首行,直接在命令行键入 file /var/* 就可以查看文件类型,file命令本身就是查看文件类型的


(3)case语句

case varname in

pattern1)

suite1

;;

pattern2)

suite2

;;

patternn)

suitenn

;

*)

    other_suiten

;;

esac

    ;;双分号结尾,单分号表示结束,case是一直比较。可单独成行或者在最后一行命令最后

    case中各pattern可以使用模式

    a|b:a或b

    *:匹配任意长度的任意字符

    ?:匹配任意单个字符

    [-]:范围匹配

    [a-z])

    [0-9])

        示例;让用户输入一个选项,根据其选项给出对应的信息

#!/bin/bash
#
#
cat <<EOF
cpu) display cpu information
mem) display memory iniformation
disk) dispaly disks iniformetion
quit) quit
================================
EOF
read  -p "enter your option:" option
while [ $option != "cpu" -a $option != "mem" -a $option != "disk" -a $option != "quit" ];do

	echo "enter cpu mem disk quit"
	read -p "enter your option again:" option
done

case $option in

cpu)
	lscpu ;;
mem)
	free -m ;;
disk)
	fdisk -l /dev/[hs]d[a-z] ;;
*)
	echo "quit"
	exit 1 ;;
esac



循环执行

    将一段代码重复执行0,1,多次;

 进入条件:只有在条件满足时才进入循环

 退出条件:每个循环都应该有退出条件,以有机会退出循环;

for循环

两种格式:

    (1)遍历列表

    (2)控制变量

   for循环格式

==================================

    for 变量名字 in list; do 

循环体              

done               

==================================       

    遍历列表:    

    进入条件:只要列表有可用元素,即可进入循环;

退出条件;列表中的原素遍历完成    

    list的生成方式

(1)直接给出

#!/bin/bash
#
#
for username in user22 user23 user24 ;do
	useradd $username
done

(2)整数列表

#!/bin/bash
#
#
for filename in 1 2 3 4 5;do
	touch $filename
done

(a){start..end}

#!/bin/bash
#
#
declare -i sum=0
for i in {1..100};do
	let sum=sum+i
done
echo "$sum"

(b)seq[start [incremtal]]last

#!/bin/bash
#
#
for filename in `seq 10`;do
	touch $filename
done

(3)返回列表的命令

(4)glob

(5)变量引用

#!/bin/bash
#
#
#
username=`cut -d: -f1 /etc/passwd`
for userid in $username;do
	id $userid
done
#!/bin/bash
#
#
declare -i sum=0
id=`cut -d: -f3 /etc/passwd`
for uid in $id;do
	let sum=sum+uid
done
echo $sum


while循环

    进入条件:condition测试为"真"

 退出条件:condition测试为"假"

   while循环格式

=========================================

    while condition;do      

循环体                  

循环控制变量修正表达式         

 done                 

=========================================

示例

#!/bin/bash
#
#
declare -i i=0
declare -i sum=0
while [ $i -le 100 ];do
	let sum=sum+i
	let i++
done
echo $sum



until循环           

    进入条件:condition测试为"假"

退出条件:condition测试为"真"

  until循环格式

=============================================

    until condition;do          

循环体                   

循环控制变量修正表达式           

done                          

=============================================

示例

#!/bin/bash
#
#
declare -i i=0
declare -i sum=0
until [ $i -gt 100 ];do
	let sum=sum+i
	let i++
done
echo $sum


 break:提前跳出循环

while condition1;do

cmd1

if condition1;then

break

fi

cmdn

done

示例

#!/bin/bash
#
#
declare -i i=0
declare -i sum=0
while [ $i -le 100 ];do
	let sum=sum+i
	let i++
	if [ $i -eq 50 ];then
		break
	fi
done
echo $sum


continue:提前结束本轮循环,而直接进入下一轮循环判断;

while condition1;do

cmd1

if condition1;then

continue

fi

cmdn

done

#!/bin/bash
#
#
declare -i i=0
declare -i sum=0
while [ $i -le 100 ];do
	let sum=sum+i
	let i++
	if [ $i -eq 50 ];then
		continue
	fi
	sum1=$[sum+i]
done
echo $sum
echo $sum1


特殊执行顺序

    创建死循环:

============================================================

while true;do                        

循环体                           

done                            

退出方式;                          

某个测试条件满足时,让循环体执行break命令         

============================================================

示例

#!/bin/bash
#
#
while true;do
	if	who |grep '^hacker\>' &> /dev/null ;then
	break
	fi
done
	echo "hacker is up"
echo out now |write 'hacker'




sleep:命令

sleep – delay for a specified amount of time

延迟指令时间

sleep NUMBER[SUFFIX]…


while循环的特殊用法(遍历文件的行)

====================================================================================

     while read variable;do

循环体

done < /path/from/sumfile

依次读取/path/from/somfile文件中的每一行,且将其赋值给variable变量;

====================================================================================

示例:找出id号为偶数的用户,显示其用户名,ID和默认shell

#!/bin/bash
#
#
while read line;do
	username=`echo $line |cut -d: -f1`
	userid=`echo $line |cut -d: -f3`
	usershell=`echo $line |cut -d: -f7`
	if [ $[$userid%2] -eq 0 ];then
		echo "${username} ${userid} ${usershell}"
	fi
	
done </etc/passwd



for循环的特殊用法

==========================================================================================

for((控制变量初始化;条件判断表达式;控制变量的修正语句));;do

循环体

done

控制变量初始化;仅在循环代码开始运行时执行一次;

控制变量的修正语句;每轮循环结束后会先进行控制变量修正运算,而后再做条件判断;

==========================================================================================

    示例;打印九九乘法表(逆序)

#!/bin/bash
#
#
for ((i=1;i<=9;i++));do
	for ((j=i;j<=9;j++));do
		echo -n "$i*$j=$[i*j]	"
	done
	echo
done

     打印九九乘法表(顺序)

#!/bin/bash
#
#
for ((i=1;i<=9;i++));do
	for ((j=1;j<=i;j++));do
		echo -n "$j*$i=$[i*j]	"
	done
	echo
done















原创文章,作者:M20-1马星,如若转载,请注明出处:http://www.178linux.com/38331

(0)
M20-1马星M20-1马星
上一篇 2016-08-24 21:22
下一篇 2016-08-24 21:22

相关推荐

  • ☞Linux进程管理与性能分析

    Linux进程管理与性能分析 概述 系统维护的一个重要工作就是监控Linux系统的运行状态是否正常,分析系统资源的使用情况,进而对系统进行优化,提高其性能。在实际环境中,系统稳定性尤为重要,可以说系统的稳定性关系到企业的存亡。因此,第一时间掌握CPU、Memory、IO、Network的等系统资源的状态则可以在系统出现问题时及时解决,把损失降到最低。&nbs…

    Linux干货 2016-09-11
  • bash的重定向

    一、简介         bash的数据流重定向(redirect)是将程序的执结果重新定向到另一文件或者设备。或者把一文件重定向给一程序作为数据来源。默认情况下,命令的执行结果显示在屏幕上。文件系统中,分为:标准输入,标准输出,错误输出。 二、用法   &n…

    Linux干货 2015-08-11
  • FHS文件系统介绍及各目录功能说明

     FHS文件系统介绍及各目录功能说明 M21-陆东贵 FHS简介 Filesystem Hierarchy Standard(文件系统目录标准)的缩写,多数Linux版本采用这种文件组织形式,类似于Windows操作系统中c盘的文件目录,FHS采用树形结构组织文件。FHS定义了系统中每个区域的用途、所需要的最小构成的文件和目录,同时还给出了例外处理…

    Linux干货 2016-10-18
  • OSI七层模型

      OSI模型的七层结构 首先,OSI是什么呢?OSI(Open System Interconnection),OSI是一个开放性的通行系统互连参考模型,是一个协议规范。它把网络协议从逻辑上分为了7层。每一层都有相关、相对应的物理设备。OSI七层模型是一种框架性的设计方法 ,建立七层模型的主要目的是为解决异种网络互连时所遇到的兼容性问题,其最主要…

    2017-09-02
  • Linux的终端类型

    Linux的终端类型 Linux的终端类型: TTY(虚拟终端,图形终端) 早期的电子计算机的输入设备是穿孔卡片【又称霍列瑞斯式卡(Herman Hollerith)或IBM卡】,用有洞和无洞表示计算机二进制里面的0和1,以此来记录相关信息,但是这种方式很慢。 1986年股票代码被发明,人们通过电报和电传打印机发送实时股票价格,此时teletypewrite…

    Linux干货 2016-10-14
  • Zabbix介绍、安装配置

    Zabbix介绍、安装配置 我们为什么需要监控? 常用的开源监控系统有哪些? Zabbix架构 Zabbix的安装和配置 总结 前言 本篇文章转自我的个人博客 http://anyisalin.com 欢迎大家访问 我们为什么需要监控? 没有监控就将系统上线, 就是在耍流氓; 在生产环境中, 监控是必不可少的, 因为我们需要实时了解业务的…

    2016-05-13