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

一、条件选择、判断(if、case)···· PAGEREF _Toc493323590 \h 2
08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003400390033003300320033003500390030000000

1.1 if语句用法及实例···· PAGEREF _Toc493323591 \h 2
08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003400390033003300320033003500390031000000

1.2 case用法及实例···· PAGEREF _Toc493323592 \h 5
08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003400390033003300320033003500390032000000

二、循环语句···· PAGEREF _Toc493323593 \h 7
08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003400390033003300320033003500390033000000

2.1 for循环···· PAGEREF _Toc493323594 \h 8
08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003400390033003300320033003500390034000000

2.2 while循环···· PAGEREF _Toc493323595 \h 10
08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003400390033003300320033003500390035000000

2.3 until循环···· PAGEREF _Toc493323596 \h 12
08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003400390033003300320033003500390036000000

2.4 select循环···· PAGEREF _Toc493323597 \h 13
08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003400390033003300320033003500390037000000

2.5 循环小补充···· PAGEREF _Toc493323598 \h 14
08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003400390033003300320033003500390038000000

2.5.1 循环控制语句 continue&break· PAGEREF _Toc493323599 \h 14
08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003400390033003300320033003500390039000000

2.5.2 循环控制命令shift PAGEREF _Toc493323600 \h 15
08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003400390033003300320033003600300030000000

2.5.3 信号捕捉trap·· PAGEREF _Toc493323601 \h 16
08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003400390033003300320033003600300031000000

2.5.4 创建无限循环···· PAGEREF _Toc493323602 \h 18
08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003400390033003300320033003600300032000000

2.5.5 在循环语句中执行并行命令···· PAGEREF _Toc493323603 \h 18
08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003400390033003300320033003600300033000000

三、小补充···· PAGEREF _Toc493323604 \h 20
08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003400390033003300320033003600300034000000

1)打印等腰三角形(带闪烁)···· PAGEREF _Toc493323605 \h 20
08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003400390033003300320033003600300035000000

2)打印国际象棋棋盘···· PAGEREF _Toc493323606 \h 21
08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003400390033003300320033003600300036000000

前言

在我们使用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脚本进阶之循环判断的更多相关文章

  1. centos shell脚本编程2 if 判断 case判断 shell脚本中的循环 for while shell中的函数 break continue test 命令 第三十六节课

    centos  shell脚本编程2 if 判断  case判断   shell脚本中的循环  for   while   shell中的函数  break  continue  test 命令   ...

  2. shell脚本进阶之条件测试与条件语句

       接着上篇博客,今天整理一下关于条件测试和条件语句方面的知识. shell脚本进阶之条件测试    在编写shell脚本时,经常需要对一些条件进行判断,可以使用测试命令test辅助完成测试过程.t ...

  3. 15-1 shell脚本进阶

    shell脚本进阶 循环 循环执行 将某代码段重复运行多次 重复运行多少次 循环次数事先已知 循环次数事先未知 有进入条件和退出条件 for, while, until for循环 for VAR i ...

  4. shell 脚本基础与条件判断

    #!shell脚本格式决定专业性 #!/bin/bash #filename:脚本名 #author:作者 #date:时间 #脚本作用 脚本的执行方式  #脚本名为wk.sh 绝对路径 /root/ ...

  5. shell脚本之for循环

    shell脚本之for循环 author :headsen  chen       2017-10-18    09:50:41 个人原创,转载请注明.否则依法追究法律责任 1,cat forloop ...

  6. shell 脚本中所有循环语法

    写出 shell 脚本中所有循环语法 for 循环 : for i in $(ls);do echo item:$i done while 循环 : #!/bin/bash COUNTER=0 whi ...

  7. shell脚本中select循环语句用法

    shell脚本中select循环语句 1. 脚本中select的语法格式 select VAR in LIST do command1 command2 ... ... commandN done s ...

  8. Linux运维之shell脚本进阶篇

    一.if语句的使用 1)语法规则 if [条件] then 指令 fi 或 if [条件];then 指令 fi 提示:分号相当于命令换行,上面两种语法等同特殊写法:if[ -f"$file ...

  9. shell脚本进阶 详解及其实例(一)

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

随机推荐

  1. Selenium+java操作浏览器cookies

    描述:登录CSDN,将登录信息cookies保存到文件,再次打开网页时,直接利用文件中的数据登录. 1. 获取cookies并保存到文件 步骤: ① 打开CSDN的登录界面: ② 填写用户名和密码: ...

  2. Autofac in webapi2

    安装包:Autofac.webapi2 注意: install-package autofac.webapi2 (注意:您的项目中如果使用的是webapi2,此处必须为webapi2而不是webapi ...

  3. python3.6----datetime.timedelta

    学习利用python进行数据分析---时间序列分析的时候发现python2.7版本的timedelta模块跟python3.6模块区别python2.7:in:delta= datetime(2017 ...

  4. BFS:noi6044鸣人与佐助

    PS:一道XX到我心态崩溃的好(傻逼)题. 先粘题目: 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到,只不过 ...

  5. POI通过模板导出EXCEL文件

    一般的EXCEL导出使用POI先创建一个HSSFWorkbook,然后通过不断创建HSSFRow,HSSFCell后设置单元格内容便可以完成导出. 这次在项目中需要用到模板,导出的内容包括(1.模板中 ...

  6. Python第一行代码

    Python版本:Python 3.6.1 0x01 命令行交互 在交互式环境的提示符>>>下,直接输入代码,按回车,就可以立刻得到代码执行结果.现在,试试输入100+200,看看计 ...

  7. JavaWeb(三)servlet

    Servlet * 什么是Servlet 是运行在web服务器端的Java应用程序,它使用JAVA语言编写,具有Java语言的优点.与Java程序的区别:Servlet对象主要封装了对Http请求的处 ...

  8. 为什么eclipse修改程序之后运行的时候还是前一版本的内容?

    问题:我用的是Eclipse Java Neon4.6.0,同样的这个问题也出现在其他的Eclipse的版本上,我在对我的代码内容进行修改的时候,点击运行,发现还是执行的修改之前的文件,这让我很头疼. ...

  9. 陈年佳酿之 - Winform ListView 控件 double click 事件中获取选中的row与column

    背景 最近收到了一个关于以前项目的维护请求,那时的楼主还是刚刚工作的小青年~~~ 项目之前使用的是.net/winform.今天重新打开代码,看着之前在FrameWork2.0下面的代码, 满满的回忆 ...

  10. 一起来学Go --- (go的变量)

    变量 变量是几乎所有编程语言中最基本的组成元素,从根本上说,变量相当于是一块数据存储空间的命名,程序可以通过定义一个变量来申请一块数据存储空间,之后可以通过引用变量名来使用这块存储空间.go语言中的变 ...