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. Shell脚本问题详解

    例1:找出当前系统中端口大于1024的程序! 使用netstat -tuln查询出的结果如下,需要输出红色字体的行: [root@localhost ~]# netstat -tuln Active ...

  2. 红帽Linux故障定位技术详解与实例(3)

    红帽Linux故障定位技术详解与实例(3)   在线故障定位就是在故障发生时, 故障所处的操作系统环境仍然可以访问,故障处理人员可通过console, ssh等方式登录到操作系统上,在shell上执行 ...

  3. 红帽Linux故障定位技术详解与实例(2)

    红帽Linux故障定位技术详解与实例(2) 2011-09-28 14:26 圈儿 BEAREYES.COM 我要评论(0) 字号:T | T 在线故障定位就是在故障发生时, 故障所处的操作系统环境仍 ...

  4. [Spark内核] 第36课:TaskScheduler内幕天机解密:Spark shell案例运行日志详解、TaskScheduler和SchedulerBackend、FIFO与FAIR、Task运行时本地性算法详解等

    本課主題 通过 Spark-shell 窥探程序运行时的状况 TaskScheduler 与 SchedulerBackend 之间的关系 FIFO 与 FAIR 两种调度模式彻底解密 Task 数据 ...

  5. httpd配置文件详解及实例

    httpd配置文件详解及实例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.http协议的组成 http协议是C/S架构:我们可以把浏览器(如:IE,Firefox,Safar ...

  6. 红帽Linux故障定位技术详解与实例(4)

    红帽Linux故障定位技术详解与实例(4)   在线故障定位就是在故障发生时, 故障所处的操作系统环境仍然可以访问,故障处理人员可通过console, ssh等方式登录到操作系统上,在shell上执行 ...

  7. 红帽Linux故障定位技术详解与实例(1)

    红帽Linux故障定位技术详解与实例(1) 2011-09-28 14:26 圈儿 BEAREYES.COM 我要评论(0) 字号:T | T 在线故障定位就是在故障发生时, 故障所处的操作系统环境仍 ...

  8. Jenkins企业应用进阶详解(一)

    Jenkins企业应用进阶详解(一) 链接:https://pan.baidu.com/s/1NZZbocZuNwtQS0eGkkglXQ 提取码:z7gj 复制这段内容后打开百度网盘手机App,操作 ...

  9. Linux shell tr 命令详解

    该随笔摘自 https://www.jb51.net/article/103892.htm Linux shell tr 命令详解 1. 用途 tr,translate的简写,主要用于压缩重复字符,删 ...

随机推荐

  1. java map常用的4种遍历方法

    public static void main(String[] args) { Map<String, String> map = new HashMap<String, Stri ...

  2. Elasticsearch数据类型

    Elasticsearch自带的数据类型是Lucene索引的依据,也是做手动映射调整的依据.映射中主要就是针对字段设置类型以及类型相关参数.1.JSON基础类型如下:字符串:string数字:byte ...

  3. docker 卸载

    1首先搜索已经安装的docker 安装包 [root@localhost ~]# yum list installed|grep docker 或者使用该命令 [root@localhost ~]# ...

  4. 解决ImmediateDeprecationError 用Python获取Yahoo数据

    最近正在看用 python 进行数据处理的内容,很多教程都会用 pandas 去抓取金融数据.我也尝试跑教程上的示例代码以抓取数据. 本文着重介绍遇到的问题以及解决方法. 注:我使用的是 Python ...

  5. python,tensorflow,CNN实现mnist数据集的训练与验证正确率

    1.工程目录 2.导入data和input_data.py 链接:https://pan.baidu.com/s/1EBNyNurBXWeJVyhNeVnmnA 提取码:4nnl 3.CNN.py i ...

  6. BZOJ1492 [NOI2007]货币兑换

    Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券).每个持有金券的顾客都有一个自己的帐户.金券的数目可以是一个 ...

  7. 新安装的Apache和php,测试可以解析phpinfo,但是无法打开drupal网站

    没有去掉php.ini中mysql相关的一些扩展的注释

  8. androidcookie存储sqllite

    /**声明一些数据库操作的常量*/  private static SQLiteDatabase mDatabase = null;  private static final String DATA ...

  9. Avalon探索之旅

    avalon2是一款基于虚拟DOM与属性劫持的 迷你. 易用. 高性能 的 前端MVVM框架, 拥有超优秀的兼容性, 支持移动开发, 后端渲染, WEB Component式组件开发, 无需编译, 开 ...

  10. Struts 2 官方文档中文版

    最近正在学 Struts 2 ,咱英文水平不行啊,找到了<Struts 2 官方文档中文版>,虽然翻译的不全,有总比没有强. 地址:https://cwiki.apache.org/con ...