Shell编程学习之一

一、脚本的书写和执行

脚本第一行,顶格:#!/bin/bash

其中 #!称之为shebang,LinuxOS会的程序载入器会分析shebang后的内容,将这些内容作为解释器的指令。常见的有:#!/bin/bash,#!/usr/bin/python等。

以#开头的行都是注释的行,会被解释器忽略。

其他就是脚本的主要内容了,主要是由许多命令组成的。

脚本语法检查:bash -n 脚本名  例如:bash -n httpd

执行: bash 脚本名 或者 给脚本x权限;写出脚本的路径执行

bash -n 单步执行,可以看到脚本执行过程中的每一步

二、shell脚本执行过程

顺序执行:从上到下依次执行

选择执行:根据测试条件执行,满足某个测试条件是,执行对应的分支

循环执行:将一段代码反复执行多次。根据循环退出条件退出。

三、shell的变量类别

本地变量,环境变量,局部变量,位置变量,特殊变量。这里可能位置变量和特殊变量使用较多一些。例如:S#(参数个数),$@ $*(参数列表)。具体代表的意义请参照http://guoting.blog.51cto.com/8886857/1433602里面所说明的。

四、循环语句

常见的循环语句有for,while,until。循环的主要意义在于,重复执行近似的代码,提高代码利用率。

1)for循环:遍历有限个元素列表

for语句的语法格式:

for VAR_NAME in LIST

do

do something

done

退出条件:遍历完LIST中的所有元素

如何生成数值列表

1、{start..end} 例如{100..120}代表初始值是100,步长是1,最大值是120的整数。

2、命令引用 `seq [start [increment]] end`

seq 12 :表示初始值是1,步长是1,最大值是12的整数

seq 12,24 :表示初始值是12,步长是1,最大值是34的整数

seq 12,3,24 :表示初始值是12,步长是3,最大值是34的整数

生成列表的方式:

1、手动给个列表:

for i in 1 2 3 4 5

2、数值列表:

{start..end}

`seq [start [increment]] end`

3、$*, $@ :调用脚本参数的列表

4、命令生成列表 例如:`ls /path/to/where`

for的另一种格式,此种格式更接近C语言的for语句,格式如下:

for(( 初始条件;测试条件;修改表达式));do

循环体

done

例如:求1到100的整数之和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
# description:sum 1..100
# version:0.0.0
# date:2014-07-14
# author: Alex
# license: GPL
let sum=0
for ((i=0;$i <= 100;i++));do
    let sum+=$i
done
echo $sum

bash如何实现算术运算:

1、定义整形变量的方法:

let VAR_NAME=VALUE 例如: let sum=0

declare -i VAR_NAME=VALUE 例如:declare -i sum=0

注意:即使没有定义为整型变量,字符型的数字依然可以参与算术运算;bash会执行变量类型的隐式类型转换;

2、实现算术运算的方式:

let VAR_NAME=ARITHMATIC_EXPRESSION

VAR_NAME=$[ARITHMATIC_EXRESSION]

VAR_NAME=$((EXPRESSION))

VAR_NAME=$(expr $num1 + $num2)

例如:实现算术3+2

let sum=3+2

sum=$[3+2]

sum=$((3+2))

sum=$(expr 3 + 2) 注意:这里的空格

3、常见的算术运算符

一般的算术运算符:+ - * / % **(乘方)

增强型的算术运算符:++ += *= /= %=

这些都是双目运算符。

练习:写一个脚本,满足以下要求:

1、创建用户tuser501-tuser510;

2、创建目录/tmp/dir-当前日期时间;

3、在/tmp/dir-当前日期时间 目录中创建9个空文件file101-file110

4、将file101的属主改为tuser501,依次类推,一直将file110的属主改为tuser510;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/bin/bash
# Name:tuser501-510.sh
# Description: testing
# Version: 0.0.1
# Author: Alex
# Date: 2014-07-08
dir_name="/tmp/dir-`date +%Y%m%d-%H%M%S`"
/bin/mkdir $dir_name
for num in {101..110};do
    /bin/touch $dir_name/file$num
    user_num=$[$num+400]
    /usr/sbin/useradd tuser$user_num &>/dev/null
    /bin/chown tuser$user_num $dir_name/file$num
done 
echo "The result:"
/bin/ls -l  $dir_name   
[root@server scripts]# chmod +x tuser501-510.sh
[root@server scripts]# bash -n tuser501-510.sh
[root@server scripts]# ./tuser501-510.sh
The result:
total 0
-rw-r--r-- 1 tuser501 root 0 Jul  9 11:33 file101
-rw-r--r-- 1 tuser502 root 0 Jul  9 11:33 file102
-rw-r--r-- 1 tuser503 root 0 Jul  9 11:33 file103
-rw-r--r-- 1 tuser504 root 0 Jul  9 11:33 file104
-rw-r--r-- 1 tuser505 root 0 Jul  9 11:33 file105
-rw-r--r-- 1 tuser506 root 0 Jul  9 11:33 file106
-rw-r--r-- 1 tuser507 root 0 Jul  9 11:33 file107
-rw-r--r-- 1 tuser508 root 0 Jul  9 11:33 file108
-rw-r--r-- 1 tuser509 root 0 Jul  9 11:33 file109
-rw-r--r-- 1 tuser510 root 0 Jul  9 11:33 file110
[root@server scripts]#

2)while,until语句

while语句的语法格式:

while 测试条件 ;do

循环体

done

until语句的语法格式:

until 测试条件 ;do

循环体

done

while的执行过程是当测试条件为真,执行循环体语句,执行完成以后再判断测试条件,直到测试条件为假的时候退出。until的执行过程与while执行过程类似,主要区别是测试条件为假的时候执行循环体,测试条件为真的时候退出循环体。

while可以直接遍历文件,这在我们以后写脚本的过程中可能随时会用到。

格式:

while read VAR_NAME ;do

循环体

done < /path/to/somefile

练习:求100以内所有偶数整数之和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash
# description: the sum even of 1 to 100
# version:0.0.1
# date:2014-07-10
# author: Alex
#定义求和存储变量
declare -i sum=0
#定义计数器变量,一般whlie或者是until都会引入像计数器这种机制,这样是为了更好的实现退出
let count=0
while [ $count -le 100 ];do   #循环测试条件
        let rst=$count%2      #判断是否为偶数 也可以这样 res=$[$count%2]
        #如果是偶数,则求和。这是一种短路运算,等价于if语句
        # if [ $rst -eq 0 ];then
        #    let sum+=$count
        #fi
        [ $rst -eq 0 ] && let sum+=$count
        let count++  #实现计数
done
#输出求和结果
echo "The sum is $sum."
##until语句只需要将测试条件变为 [ $count -gt 100 ] 即可

练习:显示磁盘使用超过10%的磁盘设备和具体使用率。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
# version:0.0.0
# date:2014-07-14
# author: Alex
# license: GPL
df sed 1d > /tmp/res.txt
#df | grep -v "Use" > /tmp/res.txt
echo -e "\033[31mDisk Usage(Use > 10%):\033[0m"
while read loop ;do
    [ `echo $loop | tr -s ' 'cut -d ' ' -f5 | tr -d '%' grep -v "Use"` -gt 10 ] && \
    echo $loop | tr -s ' 'cut -d ' ' -f1,5  
done /tmp/res.txt
rm -f /tmp/res.txt
#此脚本还有缺陷(像 df 命令的结果有时一个设备的信息分布在2行的情况下,此脚本还不能处理),目的是说明while是如何遍历文件的。

脚本执行结果:

补充:

有时候我们需要执行一个死循环,这就要用到 true 和 : 命令。true 命令的作用是只返回命令状态值 0 。与之对应的是 false,它的作用只返回命令状态值 1。:命令的作用是什么都不干的命令。

在循环中,有时可能会用到以下命令:

  • trap 'CMD1;CMD2' 信号量

  • break 在脚本中一般与循环一起使用,用于跳出本层循环

  • continue 在脚本中的作用是跳过本次循环循环,直接进入到下次循环。

具体示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/bash
echo "########### test break and trap ##################"        
read -p "Plz enter a username: " userName
# 捕获 Ctrl + C 信号
trap 'echo "quit";exit 3' INT 
# while : ;do
while truedo
if who grep "\<$userName\>" &> /dev/nullthen
    break
fi
    echo "wait..."
    sleep 5
done
echo "$userName is logged."
# 求 100 以内的所有奇数之和
echo "########### continue ##################"
for loop in {1..100};do
    if [ $[$loop%2] -eq 0 ] ;then
        continue
    else
        let sum+=$loop
    fi
done
echo "The sum is $sum."

本文转自 羊木狼 51CTO博客,原文链接:http://blog.51cto.com/guoting/1436392,如需转载请自行联系原作者

Linux Shell编程之一循环结构相关推荐

  1. (四)shell编程之循环结构

    shell编程之循环结构 #本机课程目标 掌握for循环语句的基本语法结构 掌握while和until循环语句的基本语法结构 一.for循环语句 关键词:爱的魔力转圈圈

  2. Linux Shell 编程学习总结

    Shell 教程 Shell简介:什么是Shell,Shell命令的两种执行方式 Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成 ...

  3. 【“计算机科学与技术”专业小白成长系列】Linux Shell 编程 极简教程

    Linux Shell 编程 极简教程 内容摘要 本文是 Linux Shell 编程简单入门.主要内容: Linux 简介 Shell 编程入门 Kotlin 脚本与 Shell 脚本 Linux ...

  4. 《Linux Shell编程从初学到精通(第2版)》pdf

    下载地址:网盘下载 内容简介 编辑 shell是用户与内核进行交互操作的一种接口,是linux最重要的软件之一.目前最流行的shell称为bash shell,bash shell脚本编程以其简洁.高 ...

  5. linux简单重定向代码,Linux Shell编程(26)——代码块重定向

    像 while, until, 和 for 循环代码块, 甚至 if/then 测试结构的代码块都能做到标准输入的重定向. 即使函数也可以使用这种重定向的格式 .所有的这些依靠代码块结尾的 < ...

  6. Linux循环中累计数据,linux shell 读取for循环中出现难处理的数据之单引号错误实例...

    原语句: #!/bin/bash for test in I don't know if this'll work do echo "work:$test" done 结果: wo ...

  7. shell编程之循环语句

    shell编程之循环语句 文章目录 shell编程之循环语句 一.for循环语句 1. for循环语法结构 ㈠ 列表循环 2. 应用案例 二.while循环语句 1. while循环语法结构 2. 应 ...

  8. linux —— shell 编程(文本处理)

    导读 本文为博文 linux -- shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 基本文本处理 流编辑器sed a ...

  9. linux shell 处理日语,linux —— shell 编程(文本处理)

    导读 本文为博文linux -- shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 1.基本文本处理 sort:用于排序,常 ...

最新文章

  1. 个人博客(前端菜鸡)持续开发中,可前往 欢迎访问. www.amayaliu.cn
  2. 正则表达式 perl
  3. 小程序微信授权登录服务器异常,解决调试腾讯云微信小程序Demo错误“登录失败:调用鉴权服务失败#40029_WEIXIN_CODE_ERR”...
  4. SQLplus 和mysql区别_mysql和oracle的区别有哪些
  5. 4- Mybatis 的参数深入
  6. 她学术造假导致导师自杀,后将这段学术经历出书贩卖,一年收入上百万...
  7. 线性代数学习笔记——第四十讲——n维向量空间的概念
  8. TWebLive基于TRTC和IM实现web群直播
  9. 你有花生我有酒,一本学道看一天(一)
  10. register int 的作用
  11. android ota权限,Android手机Root后不能接收OTA?
  12. 65 - 请解释什么是线程锁,以及如何使用线程锁
  13. JAVAWEB——监听器(Listener),监听器编写步骤,八大监听器的介绍
  14. torch-fidelity 简便计算FID,ISC,KID,PPL
  15. IB36分斩获藤校?看艺术设计类专业
  16. 电脑能正常上网,但是不能连接共享的打印机 电脑无法打印 服务打开无法打印
  17. java.lang.UnsatisfiedLinkError: dll: Can't find dependent libraries
  18. mysql 利用时间查询_利用时间的艺术
  19. 软考中级程序设计师复习——软件工程(4)
  20. input复选框获取选中的值

热门文章

  1. 标准 I/O (带缓冲)
  2. 使用自己的数据集训练MobileNet、ResNet实现图像分类(TensorFlow)
  3. Java并发编程—ScheduledThreadPoolExecutor原理分析
  4. kotlin中学习笔记——null
  5. SDNU 1507.E.The Binding of Isaac
  6. linux 加jre环境变量
  7. 将maven项目托管到github
  8. ajax 上传读取excel
  9. Cisco配置单臂路由及静态路由
  10. Part5核心初始化_lesson3---关闭看门狗