shell脚本编程进阶及RAID和LVM应用1
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的更多相关文章
- shell脚本编程进阶及RAID和LVM应用2
文件测试 存在性测试 -a FILE 这个选项的效果与-e 相同.但是它已经被弃用了,并且不鼓励使用 -e FILE 文件的存在性测试,存在则为真,否则为假 例:~]# [ -e /etc/rc.d/ ...
- Shell—脚本编程进阶
shell脚本进阶之条件语句 条件选择if语句 https://www.runoob.com/?s=shell&page=1 https://www.cnblogs.com/flylinux/ ...
- shell脚本编程进阶
在linux shell中,通常我们将一些命令写在一个文件中就算是一个shell脚本了,但是如果需要执行更为复杂的逻辑判断,我们就需要使用流程控制语句来支持了.所谓流程控制既是通过使用流程控制语句对程 ...
- 《Linux命令行与shell脚本编程大全》 第二十七章 学习笔记
第二十七章:shell脚本编程进阶 监测系统统计数据 系统快照报告 1.运行时间 uptime命令会提供以下基本信息: 当前时间 系统运行的天数,小时数,分钟数 当前登录到系统的用户数 1分钟,5分钟 ...
- 《Linux命令行与shell脚本编程大全 第3版》
第一部分 Linux 命令行 第1章 初识Linux she1.1 什么是Linux 21.1.1 深入探究Linux 内核 31.1.2 GNU 工具 61.1.3 Linux 桌面环境 81 ...
- Shell脚本编程30分钟入门
Shell脚本编程30分钟入门 转载地址: Shell脚本编程30分钟入门 什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_t ...
- Linux shell脚本编程(三)
Linux shell脚本编程 流程控制: 循环语句:for,while,until while循环: while CONDITION; do 循环体 done 进入条件:当CONDITION为“真” ...
- Linux shell脚本编程(二)
Linux shell脚本编程(二) 练习:求100以内所有偶数之和; 使用至少三种方法实现; 示例1: #!/bin/bash # declare -i sum=0 #声明一个变量求和,初始值为0 ...
- Linux shell脚本编程(一)
Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...
随机推荐
- iOS-static和const联合使用;使用static const 与 #define
static和const联合使用: static将一个全局变量变成局部变量 const将一个局部变量变成局部常量 // 定义了一个局部常量 static const CGFloat ...
- web框架学习路线
0.配置 1.路由 2.view 3.model 4.序列化与反序列化. 5.auth&permission 6.header处理 7.http client
- Vulnhub-XXE靶机学习
------------恢复内容开始------------ 前两天在微信公众号上看见了这个XXE靶场,就想试一试,虽然网上关于这个的文章已经写了太多太多了,但还是要写出来划划水,233333333, ...
- 【Qt开发】 QT:make: Nothing to be done for `first'和error:QtSql:No such file or directory
http://blog.csdn.NET/heqiuya/article/details/7774208 这是QT编程中常见的两个编译错误.可能你的代码在window下编译能正常通过,可是到到Linu ...
- idea配置svn,maven,jdk和一些基础设置
1.idea配置svn 1.1 首先下载svn,百度云链接:链接:https://pan.baidu.com/s/1PvSBuHcHMrrBHfnOfVRC9Q 提取码:hs7l 1.2 开始安装 这 ...
- new pdo 连接很慢的原因和解决办法
1.使用IP而不是域名,使用域名会让PDO在连接之前进行一次不必要的dns lookup,当DNS缓存过于巨大的时候,这个问题可能会更严重.(即使是运行在本机,使用 127.0.0.1 而不是 loc ...
- DB2部分查询SQL
/* 部分SQL */ --添加主键 alter TABLE TABLE_SCHEMA.TABLE_NAME add constraint PK_TABLE_NAME primary key(COL1 ...
- 关于@JsonFormat(出参格式化)和@DateTimeFormat(入参格式化)
背景: 从数据库查询获取数据时候 返回的json数据 日期会出现一串数字或者其他形式 和我们期待的不一样 如下图: 一开始使用@DateTimeFormat注解 但是输出结果和没有使用返回的jso ...
- 使用JavaScript随机生成数字混合字母的验证码
<script> // 封装一个随机生成数字的函数 function random(a, b) { var n = Math.round(Math.random() * (a - b) ...
- Philosopher’s Walk --DFS
题意: Philosopher’s Walk 图,告诉你step返回位置. 思路: 按四个块DFS #define IOS ios_base::sync_with_stdio(0); cin.tie( ...