bash脚本编程
脚本文件格式:
第一行,顶格写: #!/bin/bash
注释行:#开头
代码注释:写清楚注释
规范写脚本:适度缩进,添加空白行

编程语言:有编程语法格式,库,算法和数据结构
编程思想:
用代码解决问题空间-->用编程语言来解空间

变量的类型:
局部变量
本地变量
环境变量
位置参数变量
特殊变量

数据类型:字符型、数值型
shell属于弱类型,本身不支持浮点数,可借助其它工具来实现;是字符型

算术运算的表达方式:
+,-,*,/,%,**
let VAR=$num1 operator $num2
VAR=$[expression]
VAR=$((expression))
VAR=$(expr argu1 argu2 argu3)

注意:有些时候乘法符号需要转义

增强型赋值:
变量做某种算术运算后回存至此变量中:
let i=$i+#
let i+=#

+=,-=,*=,/=,%=

自增:
VAR=$[$VAR+1]
let VAR+=1
let VAR++

自减:
VAR=$[$VAR-1]
let VAR-=1
let VAR--

练习:
1、写一个脚本,内容是:计算/etc/passwd文件中的第10个用户和第20个用户的id号之和

#!/bin/bash
#
id1=$(head -10 /etc/passwd | tail -1 | cut -d: -f3)
id2=$(head -20 /etc/passwd | tail -1 | cut -d: -f3)
echo "The id1: ${id1}"
echo "The id2: ${id2}"
id_sum=$[${id1}+${id2}]
echo "The id_sum: ${id_sum}"

2、写一个脚本,内容是:计算 /etc/rc.d/init.d/functions 和 /etc/inittab 文件的空白行数之和

#!/bin/bash
#
k1=$(grep "^[[:space:]]*$" /etc/rc.d/init.d/functions | wc -l)
k2=$(grep "^[[:space:]]*$" /etc/inittab | wc -l)
sum=$[$k1+$k2]
echo "File k1: $k1"
echo "File k2: $k2"
echo "Sum: $sum"

3、写一个脚本计算两个用户user1,user2的id之和
~]# cd /tmp/
~]# mkdir scripts
~]# cd scripts/
~]# vim sum.sh

#!/bin/bash
#
id user1 &> /dev/null || useradd user1
ip user2 &> /dev/null || useradd user2
user1_id=$(id -u user1)
user2_id=$(id -u user2)
echo "The user1 id: ${user1_id}"
echo "The user2 id: ${user2_id}"
id_sum=$[$user1_id+$user2_id]
echo "The id sum: $id_sum."

条件测试:
判断某需求是否满足,需要由测试机制来实现

如何编写测试表达式以实现所需的测试:
(1)执行命令,并利用命令状态返回值来判断
例:]# grep "^$" /etc/rc.d/init.d/functions &> /dev/null
]# echo $?
0
例:]# who | grep "^centos\>"
]# echo $?
1

0:成功
1-255:失败

(2)测试表达式
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]

注意:EXPRESSION两端必须有空白字符,否则为语法错误

bash的测试类型:
数值测试
字符串测试
文件测试

数值测试:数值比较
-eq 等于,如:if [ "$a" -eq "$b" ]
-ne 不等于,如:if [ "$a" -ne "$b" ]
-gt 大于,如:if [ "$a" -gt "$b" ]
-ge 大于等于,如:if [ "$a" -ge "$b" ]
-lt 小于,如:if [ "$a" -lt "$b" ]
-le 小于等于,如:if [ "$a" -le "$b" ]
< 小于(需要双括号),如:(("$a" < "$b"))
<= 小于等于(需要双括号),如:(("$a" <= "$b"))
> 大于(需要双括号),如:(("$a" > "$b"))
>= 大于等于(需要双括号),如:(("$a" >= "$b"))

字符串测试:
= 等于,如:if [ "$a" = "$b" ]
== 等于,如:if [ "$a" == "$b" ],与=等价
注意:==的功能在[[]]和[]中的行为是不同的,如下:
1 [[ $a == z* ]] # 如果$a 以"z"开头(模式匹配)那么将为 true
2 [[ $a == "z*" ]] # 如果$a 等于 z*(字符匹配),那么结果为 true
3
4 [ $a == z* ] # File globbing 和 word splitting 将会发生
5 [ "$a" == "z*" ] # 如果$a 等于 z*(字符匹配),那么结果为 true
一点解释,关于 File globbing 是一种关于文件的速记法,比如"*.c"就是,再如~也是.
但是 file globbing 并不是严格的正则表达式,虽然绝大多数情况下结构比较像.
!= 不等于,如:if [ "$a" != "$b" ]
这个操作符将在[[]]结构中使用模式匹配.
< 小于,在 ASCII 字母顺序下.如:
if [[ "$a" < "$b" ]]
if [ "$a" \< "$b" ]
注意:在[]结构中"<"需要被转义.
> 大于,在 ASCII 字母顺序下.如:
if [[ "$a" > "$b" ]]
if [ "$a" \> "$b" ]
注意:在[]结构中">"需要被转义.
具体参考 Example 26-11 来查看这个操作符应用的例子.
-z 字符串为"null".就是长度为 0.
-n 字符串不为"null"
注意:
使用-n 在[]结构中测试必须要用""把变量引起来.使用一个未被""的字符串来使用! -z
或者就是未用""引用的字符串本身,放到[]结构中

==:是否等于
>:是否大于
<:是否小于
!=:是否不等于
=~:左侧字符串是否能够被右侧的PATTERN所匹配
例: ]# name=tom
]# [[ "$name" =~ o.* ]]
]# echo $?

-z "STRING":判断指定的字符串是否为空;空则为真,不空则为假
-n "STRING":判断指定的字符串是否为不空;不空则为真,空则为假

注意:
(1)变量字符串要加引号;不做变量替换就加单引号,做变量替换就加双引号
(2)做字符比较时要使用[[]]

脚本的状态返回值:
默认是脚本中执行的最后一条命令的状态返回值;
我们可以自定义状态退出状态:
exit [n]:n为自己指定的状态码
注意:shell进程遇到exit时,即会终止,因此,整个脚本执行即为结束

文件测试
-a FILE 这个选项的效果与-e 相同.但是它已经被弃用了,并且不鼓励使用
-e FILE
文件的存在性测试,存在则为真,否则为假
存在性及类型测试
-b FILE:是否存在并且为 块设备 文件
-c FILE:是否存在并且为 字符设备 文件
-d FILE:是否存在并且为 目录 文件
-f FILE:是否存在并且为 普通 文件
-h FILE 或 -L FILE:是否存在并且为 符号连接 文件
-p FILE:是否存在并且为 命名管道 文件
-S FILE:是否存在并且为 套接字 文件
文件权限测试:
-r FILE:是否存在并且对当前用户 可读
-w FILE:是否存在并且对当前用户 可写
-x FILE:是否存在并且对当前用户 可执行
特殊权限测试:
-u FILE:是否存在并且 拥有suid权限
-g FILE:是否存在并且 拥有sgid权限
-k FILE:是否存在并且 拥有sticky权限
文件是否有内容:
-s FILE:是否存在并且 有内容
时间戳:
-N FILE:文件自从上一次读操作后是否被修改过
从属关系测试:
-O FILE:当前用户是否为文件的属主
-G FILE:当前用户是否属于文件的属组
双目测试:
FILE1 -ef FILE2:FILE1与FILE2是否指向同一个文件系统的相同inode的硬链接
FILE1 -nt FILE2:FILE1是否新于FILE2
FILE1 -ot FILE2:FILE1是否旧于FILE2

组合测试条件:
逻辑运算:
第一种方式:
COMMAND1 && COMMAND2
COMMAND1 || COMMAND2
!COMMAND

[ -O FILE ] && [ -r FILE ]

第二种方式:
EXPRESSION1 -a EXPRESSION2
EXPRESSION1 -o EXPRESSION2
!EXPRESSION

当前用户是否是文件的属主,并且拥有可执行权限:
[ -O FILE -a -x FILE ]

参考:https://www.runoob.com/linux/linux-shell-basic-operators.html

shell脚本编程进阶及RAID和LVM应用1的更多相关文章

  1. shell脚本编程进阶及RAID和LVM应用2

    文件测试 存在性测试 -a FILE 这个选项的效果与-e 相同.但是它已经被弃用了,并且不鼓励使用 -e FILE 文件的存在性测试,存在则为真,否则为假 例:~]# [ -e /etc/rc.d/ ...

  2. Shell—脚本编程进阶

    shell脚本进阶之条件语句 条件选择if语句 https://www.runoob.com/?s=shell&page=1 https://www.cnblogs.com/flylinux/ ...

  3. shell脚本编程进阶

    在linux shell中,通常我们将一些命令写在一个文件中就算是一个shell脚本了,但是如果需要执行更为复杂的逻辑判断,我们就需要使用流程控制语句来支持了.所谓流程控制既是通过使用流程控制语句对程 ...

  4. 《Linux命令行与shell脚本编程大全》 第二十七章 学习笔记

    第二十七章:shell脚本编程进阶 监测系统统计数据 系统快照报告 1.运行时间 uptime命令会提供以下基本信息: 当前时间 系统运行的天数,小时数,分钟数 当前登录到系统的用户数 1分钟,5分钟 ...

  5. 《Linux命令行与shell脚本编程大全 第3版》

    第一部分 Linux 命令行 第1章  初识Linux she1.1   什么是Linux 21.1.1 深入探究Linux 内核 31.1.2 GNU 工具 61.1.3 Linux 桌面环境 81 ...

  6. Shell脚本编程30分钟入门

    Shell脚本编程30分钟入门 转载地址: Shell脚本编程30分钟入门 什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_t ...

  7. Linux shell脚本编程(三)

    Linux shell脚本编程 流程控制: 循环语句:for,while,until while循环: while CONDITION; do 循环体 done 进入条件:当CONDITION为“真” ...

  8. Linux shell脚本编程(二)

    Linux shell脚本编程(二) 练习:求100以内所有偶数之和; 使用至少三种方法实现; 示例1: #!/bin/bash # declare -i sum=0 #声明一个变量求和,初始值为0 ...

  9. Linux shell脚本编程(一)

    Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...

随机推荐

  1. Thinking - 一些有效阅读的方法

    有策略,忌盲目.讲方法,别蛮干! 1- 阅读方法 1.1 做好眼前事 排除其他事项干扰,营造适合阅读的状态和环境,专注地投入阅读之中. 如果被一堆乱糟糟的事情烦扰,身心处于一个疲惫的状态,必然无法保持 ...

  2. 事理学神器PDCA

    做事情都按PDCA循环来做,基本就是一个靠谱的人. 这个方法论其实也符合架构师的思维中的分治理论.把大事拆分成一件件小事,并把小事做好. Plan Do Check Action

  3. Java学习笔记-包装类

    基本数据类型对象包装类的最常见作用,就是用于基本数据类型和字符串类型之间做转换 包装类的由来 为了解决8种基本数据类型的变量不能当成Object类型变量使用的问题,Java提供了包装类(Wrapper ...

  4. jquery和Ajax(异步js和XML)的应用

    Ajax不是值一种单一的技术,而是有机的利用了一系列的交互式网页应用相关的技术所形成的的结合体.它的出现,解开了无刷新更新网页的新时代,并代替传统的Web方式和通过隐藏的框架来进行异步提交的趋势,是w ...

  5. [转帖]Kafka 原理和实战

    Kafka 原理和实战 https://segmentfault.com/a/1190000020120043 两个小时读完... 实在是看不完... 1.2k 次阅读  ·  读完需要 101 分钟 ...

  6. es6学习笔记(一)环境搭建

    1.安装node.js.这个自行百度安装就好了,没什么说的,安装完配置环境变量.因为后面安装第三方包是要用到npm命令,装完node就等于安装完了npm 2.项目目录创建 mkdir es6 cd e ...

  7. 注解@PostConstruct与@PreDestroy详解及实例

    Java EE5 引入了@PostConstruct和@PreDestroy这两个作用于Servlet生命周期的注解,实现Bean初始化之前和销毁之前的自定义操作.此文主要说明@PostConstru ...

  8. log4j一些配置用法

    Log4j基本用法----日志级别 基本使用方法: Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式.日志信息的优先级从高到低有ERROR.WARN.INFO ...

  9. 第7章:LeetCode--算法:递归问题

    70. Climbing Stairs This problem is a Fibonacci problem.F(n)=F(n-1)+F(n-2);Solving this problem by r ...

  10. 剑指offer17:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

    1 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 2 思路和方法 (1)先在A中找和B的根节点相同的结点 (2)找到之后遍历对应位置的其他结点, ...