shell脚本进阶之循环判断
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
keer
keer
2
25
2017-09-16T03:12:00Z
2017-09-16T03:12:00Z
21
1504
8576
71
20
10060
16.00
false
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:等线;
mso-ascii-font-family:等线;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:等线;
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:等线;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}
TOC \o "1-3" \h \z \u 前言···· PAGEREF _Toc493323589 \h 2
08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003400390033003300320033003500380039000000
前言
在我们使用linux的过程中,脚本可以给我们省很多时间和精力,比如,我们要定期备份一些文件,如果我们纯手工去操作的话,每到一个时间段我们就要去进行备份的操作,如果某一次我们在干其他事情的时候,把这件事情忘了那可怎么办╮(╯﹏╰)╭这个时候,我们就可以把需要执行的备份命令放在一个脚本里面,通过一些语句去判断是否符合我们执行命令的条件,实现自动化0.0这样不就省时省心很多啦~老板再也不用担心我忘记备份ヽ( ̄▽ ̄)ノ那么,接下来,小编就来分享一下脚本的语法及实例。
一、条件选择、判断(if、case)
1.1 if语句用法及实例
当我们在脚本中遇到需要判断的时候,我们就可以用if语句来实现。具体的语法如下:
- 单分支
if 判断条件;then
条件为真的分支代码
fi
- 双分支
if 判断条件; then
条件为真的分支代码
else
条件为假的分支代码
fi
- 多分支
if 判断条件1; then
条件为真的分支代码
elif 判断条件2; then
条件为真的分支代码
elif 判断条件3; then
条件为真的分支代码
else
以上条件都为假的分支代码
fi
在多分支中,系统会逐条判断你写入的条件,第一次遇到“真”条件时,执行该分支,而后结束整个if语句。
注意:1、if和fi是成对出现的
2、if语句可以嵌套。
Example:
1)判断两个数字的大小
- #!/bin/bash
- #定义变量
- read -p "Please input the first num:" num1
- read -p "Please input the second num:" num2
- #判断数字是否符合标准
- if [[ $num1 =~ ^[-]+$ && $num2 =~ ^[-]+$ ]];then
- # 判断两个数字的大小并输出判断结果
- if [ $num1 -lt $num2 ];then
- echo "The num2 is biger than the num1"
- elif [ $num1 -eq $num2 ];then
- echo "Two numbers equal"
- else
- echo "The num1 is biger than the num2"
- fi
- else
- echo "Please enter the correct number"
- fi
- #删除变量
- unset num1 num2
2)编写脚本/root/bin/createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之;显示添加的用户的id号等信息
- #!/bin/bash
- #定义变量
- read -p "请输入一个用户名:" name
- #判断用户名是否存在
- if `id $name &> /dev/null`;then
- # 若存在,则输出ID等信息
- echo "用户存在,用户的ID信息为:`id $name`"
- else
- # 若不存在,则添加用户,设置密码为随机8位,下次登录时提示修改密码,同时显示ID等信息
- passwd=`cat /dev/urandom |tr -cd [:alpha:] |head -c8`
- `useradd $name &> /dev/null`
- `echo "$passwd" | passwd --stdin $name &> /dev/null`
- echo "用户名:$name 密码: $passwd" >> user.txt
- `chage -d $name`
- echo "用户已添加,用户的ID信息为:`id $name` 密码为:$passwd"
- fi
- #删除变量
- unset name passwd
1.2 case用法及实例
当涉及到多个条件匹配的时候,我们用if可能就很麻烦了,这个时候,我们就可以用case来编写这个脚本。case的具体语法如下:
case 变量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默认分支
;;
esac
注意:1、case每一个分支后,都是以两个“;”结尾的(最后一个可以省略)
2、case和esac是成对出现的
Example:
1)编写一个脚本,提示用户输入信息,判断其输入的是yes或no或其他信息。
- #!/bin/bash
- #定义变量
- read -p "Yue ma?(yes or no):" ANS
- #把变量中的大写转换为小写
- ans=`echo "$ANS" |tr [[:upper:]] [[:lower:]] `
- #判断输入的信息是什么并输出结果
- case $ans in
- yes|y)
- echo "see you tonight"
- ;;
- no|n)
- echo "sorry,I have no time"
- ;;
- *)
- echo "what’s your means?"
- ;;
- esac
- #删除变量
- unset ANS ans
2)编写脚本/root/bin/filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类型)
- #!/bin/bash
- read -p "请输入一个文件路径:" file
- #判断文件是否存在
- `ls $file &> /dev/null`
- #若存在,判断文件类型并输出
- if [ $? -eq ];then
- style=`ls -ld $file | head -c1`
- case $style in
- -)
- echo "这是一个普通文件"
- ;;
- d)
- echo "这是一个目录文件"
- ;;
- l)
- echo "这是一个链接文件"
- ;;
- *)
- echo "这是其他类型文件"
- ;;
- esac
- #若不存在,提示并退出
- else
- echo "该文件不存在"
- exit
- fi
- #删除变量
- unset file style
二、循环语句
在我们的脚本中,肯定也少不了对某一段代码重复运行多次的操作,此时,我们就会用到循环语句。循环语句中,都是有进入条件和退出条件的,循环的次数也分为事先已知和事先未知(事先已知就是我们知道循环的具体次数,事先未知则是指当满足某一条件就进行循环,但是次数是不确定的。)。接下来,我们就来看看关于循环语句的用法。
2.1 for循环
for循环的执行机制是:一次将列表中的元素赋值给“变量名”;每次赋值后即执行一次循环体;直到列表中的元素耗尽,循环结束。基本的语法有两种:
1)for 变量名 in 列表 ; do
循环体
done
关于列表的生成方法,如下:
①直接给出列表
②整数列表:
(a){start…end}
(b)`seq start end`
③返回列表的命令
$(COMMAND)
④使用glob通配符如:
*.sh
⑤变量引用
$i,$*
2)for (( exp1; exp2; exp3 )); do
循环体
done
更清晰的可以从下图中看出:
Example:
1)打印九九乘法表
- #!/bin/bash
- #判断i的值是否在1-
- for i in {..};do
- # 判断j的值是否在1-$i
- for j in `seq $i`;do
- # 若在,则打印i*j的值
- echo -en "$i*$j = $[$i*$j]\t"
- done
- echo
- done
- #删除变量
- unset i j
2)输入正整数n,计算1+…+n的和
- #!/bin/bash
- #定义变量
- sum=
- read -p "请输入一个正整数:" num
- #判断num是否是正整数
- if [[ $num =~ ^[[:digit:]]+$ ]];then
- # 若是,当i在1-$num时,输出sum值
- for i in `seq $num`;do
- let sum+=$i
- done
- echo "sum=$sum"
- #若不是,提示输出正整数
- else
- echo "请输入一个正整数!"
- fi
- #删除变量
- unset i sum num
2.2 while循环
while循环比for循环略复杂一些,具体语法如下:
while CONDITION; do
循环体
done
注意:1、进入条件:CONDITION为true;退出条件:CONDITION为false。
2、CONDITION为循环控制条件:进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;知道条件测试状态为“false”终止循环。
3、CONDITION一般应该有循环控制变量;此变量的值会在循环体不断地被修正。
Example:
1)计算100以内所有正奇数之和
- #!/bin/bash
- #定义变量
- i=
- sum=
- #当i<100时,执行下面语句
- while [ $i -le ];do
- #当i为奇数时,另sum=sum+I,i=i+
- while [ $[i%] -eq ];do
- let sum+=$i
- let i+=
- done
- # 当i不为奇数时,i=i+
- let i+=
- done
- #输出结果
- echo "sum=$sum"
- #删除变量
- unset i sum
2.3 until循环
until循环的语法和while的语法类似,但是进入和退出的条件却刚好相反,所以不常用,只要我们了解即可。具体语法如下:
until CONDITION; do
循环体
done
注意:1、进入条件:CONDITION为false;退出条件:CONDITION为true。
2、do和done成对出现。
Example:
1)循环输出1-10
- #!/bin/bash
- #定义变量
- i=
- #当i>10时,退出循环
- until [ $i -gt ];do
- # 输出i的值,i=i+
- echo $i
- let i+=
- done
- #删除变量
- unset i
2.4 select循环
select循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示PS3提示符,等待用户输入。
用户输入菜单列表中的某个数字,执行相应的命令。
用户输入被保存在内置变量REPLY中。
select的具体语法如下:
select variable in list; do
循环体命令
done
注意:①select是个无线循环,因此要记住用break命令退出循环,或用exit命令终止脚本。也可以按ctrl+c退出循环。
②select经常和case联合使用。
③与for循环类似,可以省略in list,此时使用位置变量。
Example:
1)生成菜单,并显示选中的价钱。
- #!/bin/bash
- #定义PS3提示符
- PS3="Please choose the menu:"
- #输出菜单
- select menu in yangroutang mifan hulatang jiaozi lamian huimian quit
- do
- # 判断选择
- case $REPLY in
- |)
- echo "The price is 20"
- ;;
- |)
- echo "The price is 12"
- ;;
- |)
- echo "The price is 10"
- ;;
- )
- break
- ;;
- *)
- echo "Choose error"
- ;;
- esac
- done
2.5 循环小补充
2.5.1 循环控制语句 continue&break
循环控制语句用于循环体中,常见的控制语句有两种,continue和break。接下来我们就来看看两者的区别:
continue语句结束的是本轮循环,直接进入下一轮判断;最内层是第1层。
break语句结束的则是整个循环,最内层为第1层。
Example:
1)求(1+3+…+49+53+…+99)的和
- #定义变量
- sum=
- for ((i=;i<=;i++));do
- # 当i为奇数时,继续执行
- if [ $[i%] -eq ];then
- # 当i=51时,跳过该循环
- if [ $i -eq ];then
- continue
- fi
- let sum+=$i
- fi
- done
- echo "sum=$sum"
- #删除变量
- unset i sum
2)求(1+3+…+49)的和
- #!/bin/bash
- #定义变量
- sum=
- for ((i=;i<=;i++));do
- # 当i为奇数时,继续执行
- if [ $[i%] -eq ];then
- # 当i=51时,跳出整个循环
- if [ $i -eq ];then
- continue
- fi
- let sum+=$i
- fi
- done
- echo "sum=$sum"
- #删除变量
- unset i sum
2.5.2 循环控制命令shift
位置参数可以用shift命令左移,比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1,$2,$3丢弃,$0不移动。不带参数的shift命令相当于shift 1。
我们知道,对于位置变量或命令行参数,其个数必须是确定的,或者当shell程序不知道其个数时可以把所有参数一起赋值给变量$*。当用户要求shell在不知道位置变量个数的情况下,还能逐个的把参数一一进行处理,也就是在$1后为$2等。在shift命令执行前变量$1的值在shift命令执行后就不可用了。
Example:
1)测试shift命令
- #!/bin/bash
- until [ $# -eq ];do
- echo "The first argument is:$1,The number of arguments is:$#"
- shift
- done
2.5.3 信号捕捉trap
trap是一个shell内建命令,它用来在脚本中指定信号如何处理。比如,按Ctrl+C会使脚本终止执行,实际上系统发送了SIGINT信号给脚本进程,SIGINT信号的默认处理方式就是退出程序。如果要在Ctrl+C不退出程序,那么就得使用trap命令来指定一下SIGINT的处理方式了。trap命令不仅仅处理Linux信号,还能对脚本退出(EXIT)、调试(DEBUG)、错误(ERR)、返回(RETURN)等情况指定处理方式。
基本格式语法如下:
- trap ‘触发指令’ 信号
自定义进程收到系统发出的指定信号后,将执行触发指令,而不是执行原操作
- trap ‘’ 信号
忽略信号的操作
- trap ‘-’ 信号
恢复原信号的操作
- trap -p
列出自定义信号的操作,即提示当前使用的trap操作是什么。
注意:①信号的表示方法:可以是完整信号/简写/数字(具体内容通过kill -l查询)
②信号9,强制杀死,捕获不到。
Example:
1)打印0-9,ctrl+c终止无效
- #!/bin/bash
- #设置信号捕获
- trap 'echo press ctrl+c'
- for ((i=;i<;i++));do
- sleep
- echo $i
- done
2)打印0-9,3之前ctrl+c不能终止,3之后恢复,能终止
- #!/bin/bash
- #设置信号捕获
- trap ''
- trap -p
- for ((i=;i<;i++));do
- sleep
- echo $i
- done
- trap '-' SIGINT
- for ((i=;i<;i++));do
- sleep
- echo $i
- done
2.5.4 创建无限循环
在我们的shell脚本中,可以创建一个死循环,具体设置如下:
while true;do
循环体
done
2.5.5 在循环语句中执行并行命令
当我们需要在脚本里执行一条命令很多次的时候,我们可以将其设置为并行执行,这样可以极大的提升脚本运行速度,但是也有缺点,并行执行的话,相当于开了很多子shell一起执行,运行速度上来了,但是对资源的消耗也增多了。
具体的用法示例如下:
for name in 列表; do
{
循环体
}$
done
wait
Example:
1)搜寻自己指定的的IP(子网掩码为24的)的网段中,up的ip地址
- #!/bin/bash
- #定义变量
- read -p "Please input network (eg:172.17.0.1): " net echo $net |egrep -o "\<(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
- #判断网段是否符合规范
- [ $? -eq ] || ( echo "input error";exit )
- #判断网段内哪些IP能ping通,并行执行
- IP=`echo $net |egrep -o "^([0-9]{1,3}\.){3}"`
- for i in {..};do
- {
- ping -c -w $IP$i &> /dev/null && \
- echo "$IP$i is up"
- }&
- done
- wait
- #删除变量
- unset net IP i
三、小补充
介绍了这么多语法,我们来玩一些好玩的吧~下面是小编给大家分享的几个有意思的脚本
1)打印等腰三角形(带闪烁)
- #!/bin/bash
- #num=总行号 i=第几行 j=*个数 k=空格个数
- read -p "请输入一个数字:" num
- for i in `seq $num`;do
- for k in `seq $[$num-$i]`; do
- echo -n " "
- done
- for j in `seq $[*$i-]`;do
- if [ $j -eq ] || [ $j -eq $[*$i-] ] || [ $i -eq $num ];then
- color=$[RANDOM%+]
- echo -en "\033[1;$color;5m*\033[0m"
- else
- echo -n "*"
- fi
- done
- echo
- done
- #删除变量
- unset num i j k color
具体的效果大家可以自己去尝试,就是下面两张图配合出来的效果:
2)打印国际象棋棋盘
- #!/bin/bash
- #定义变量
- color_1="\033[1;44m \033[0m"
- color_2="\033[1;45m \033[0m"
- for (( i=;$i <=;i++ ));do
- for (( j=;$j <=;j++ ));do
- if [ $[$i%] == ] && [ $[$j%] == ];then
- echo -en "$color_1$color_2"
- elif [ $[$i%] == ] && [ $[$j%] == ];then
- echo -en "$color_2$color_1"
- fi
- done
- echo
- done
- #删除变量
- unset color_1 color_2 i j
具体的颜色大家可以根据自己的喜好来调整~
shell脚本进阶之循环判断的更多相关文章
- centos shell脚本编程2 if 判断 case判断 shell脚本中的循环 for while shell中的函数 break continue test 命令 第三十六节课
centos shell脚本编程2 if 判断 case判断 shell脚本中的循环 for while shell中的函数 break continue test 命令 ...
- shell脚本进阶之条件测试与条件语句
接着上篇博客,今天整理一下关于条件测试和条件语句方面的知识. shell脚本进阶之条件测试 在编写shell脚本时,经常需要对一些条件进行判断,可以使用测试命令test辅助完成测试过程.t ...
- 15-1 shell脚本进阶
shell脚本进阶 循环 循环执行 将某代码段重复运行多次 重复运行多少次 循环次数事先已知 循环次数事先未知 有进入条件和退出条件 for, while, until for循环 for VAR i ...
- shell 脚本基础与条件判断
#!shell脚本格式决定专业性 #!/bin/bash #filename:脚本名 #author:作者 #date:时间 #脚本作用 脚本的执行方式 #脚本名为wk.sh 绝对路径 /root/ ...
- shell脚本之for循环
shell脚本之for循环 author :headsen chen 2017-10-18 09:50:41 个人原创,转载请注明.否则依法追究法律责任 1,cat forloop ...
- shell 脚本中所有循环语法
写出 shell 脚本中所有循环语法 for 循环 : for i in $(ls);do echo item:$i done while 循环 : #!/bin/bash COUNTER=0 whi ...
- shell脚本中select循环语句用法
shell脚本中select循环语句 1. 脚本中select的语法格式 select VAR in LIST do command1 command2 ... ... commandN done s ...
- Linux运维之shell脚本进阶篇
一.if语句的使用 1)语法规则 if [条件] then 指令 fi 或 if [条件];then 指令 fi 提示:分号相当于命令换行,上面两种语法等同特殊写法:if[ -f"$file ...
- shell脚本进阶 详解及其实例(一)
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
随机推荐
- 1.nodejs介绍
1.什么是nodejs 1.(javascript跑在机器端,服务端)Javascript on the machine 2.(跑在谷歌v8引擎上)A runtime for Google Chrom ...
- [转载]Splay Tree数组实现+详解
变量声明:f[i]表示i的父结点,ch[i][0]表示i的左儿子,ch[i][1]表示i的右儿子,key[i]表示i的关键字(即结点i代表的那个数字),cnt[i]表示i结点的关键字出现的次数(相当于 ...
- 关于Spring总结
关于Spring总结 Spring引入 传统的基于mvc的项目框架结构:Entity / dao / service / action 简单用户访问流程:/user.action ----> T ...
- jquery.cxcalendar 插件基本使用
<link href="~/Content/Calendar/css/jquery.cxcalendar.css" rel="stylesheet" /& ...
- ubuntu中安装搜狗输入法
1.查看系统中是否安装fcitx,libss2-1的依赖包,查看命令 dpkg -I | grep fcitx dpkg -I | grep libssh 没有安装的可以如下图命令安装 2.接下来我 ...
- Jmeter+badboy环境搭建
[JMeter安装] 1. 访问官网 下载jmeter包 http://jmeter.apache.org/ 2. 解压到安装目录 D:\Program Files (x86)\apache-jmet ...
- javascript二维数组排序
js使用sort()函数对二维数组快速排序的写法 作者:admin 时间:2015-7-3 9:31:4 浏览:1847 js数组的排序方法有很多,冒泡法,插入法等等,不过对于数组的排序来 ...
- eclipse的xml文件提示templates的模板.md
eclipse的xml文件提示templates的模板 <?xml version="1.0" encoding="UTF-8" standalone=& ...
- 【Linux】修改Linux字符集
一.查看字符集 常见的几种方法: (1) [root@devhxyw03 ~]# echo $LANG zh_CN.GBK (2) [root@devhxyw03 ~]# env | grep LAN ...
- mysql用户权限管理
参考文章:http://www.cnblogs.com/jackruicao/p/6068821.html?utm_source=itdadao&utm_medium=referral (1) ...