一、上一节是正则表达式,课程在B站上:马哥正则表达式,王晓春讲师。
视频地址:https://www.bilibili.com/video/av33607890
二、bash写的shell脚本
第一节P1
- 第一行必须加上: #!/bin/bash路径,保证以后执行权限。是指此脚本使用/bin/bash来解释执行,#!是特殊的表示符,其后面根的是此解释此脚本的shell的路径。
- shell脚本中命令错误不会影响执行,语法错误是会影响执行,能够直观的看到。
- 检测脚本中的语法错误: bash -n /path/to/some_script, 只能检查语法错误,检查不出来命令不存在的问题。
跟踪调试脚本的执行: bash -x /patch./to/some_script - 变量: $PATH 加上$ 符号的变量。代表二进制数字,代表数据的地址。,变量是个用户用的,0101010是个计算机用的。
可以自定义变量比如: dhh="123", echo $dhh 就可以显示出来。重新赋值的时候会在换一个块地址空间,原来的数据会自动被回收。
加引号是比较严谨的写法。如果是写的命令,如: name= `hostname`, 加特殊的转义符。
echo "$name" 保留与原来的格式,如多行的情况。
变量也可以用两外的变量赋值:但是要加上$name符号。
变量也可能是数值,整形, 字符等。i=100, 实际是将i当成了一个字符串。
强类型,与弱类型, bash是弱类型,不能使用保留字,if, for等type if可以查看。见名知义, 驼峰法:student_name或者studentName。
echo && 表示当前bash进程的PID编号。PPID:表示父进程的编号。父子关系: pstree -p (如果未安装yum install psmisc)
变量的种类:
局部变量:在当前session会话中有效,新窗口无效, 开启新的bash程序,和上一个bash是父子关系, 也不能查看其它bash中定义的变量。上下级不会相互影响各自变量的定义。
全局变量: 必须使用关键字echo $name, export name(export name="qin")就可以将普通变量声明为全局变量。可以传递,可以修改,但是改完后不能回传,父可以传给子进程,但是不能回传.export直接显示目前环境中的环境变量。declare -x也是一种声明环境变量的方式。env:显示所有环境变量(系统自带的和自己定义的都可以显示)。
删除自定义环境变量:unset name(需要手动释放内存)
set: 显示所有的变量。
第二节P2
- 小括号特性(), 独立于外部的进程的变量,仅仅在小括号中间有效,一次性使用不影响外面的进程的变量
- 位置变量:命令后面跟不同的参数,实现不同的功能。用与让脚本在脚本代码中调用通过命令行传递给他的参数
参数:$1 $2 $3表示对应的第几个参数,${10}表示第十个参数,10以上的参数需要用大括号括起来。
$* :表示所有的参数是一个整体的输入。对于在一个脚本中调用另一个脚本传入的传参数,要使用:
$@,也表示所有的参数,但是表示是独立的输入(两者只有在被双引号括起来的时候才有区别)
$# 传递给脚本的参数的个数,
$0: 表示命令本省
set ---清空所有的位置变量 - 重要: 每个文件的开头都要有 #!/bin/bash
- 变量声明:
export name=Value
declare -x name=Value - 变量引用: $name, ${name}
- 声明只读变量“:
readonly name, declare -r name
查看只读变量: readonly -p - ls |wc -l 统计文件夹下的文件个数
- cat /etc/centos-release 查看内核版本
cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core)
第三节P3
- $0显示的是脚本的名称(软链接的名字)
- 多个参数个数:每次只去$1, 然后后面参数往前移动,就是shift操作:整体从后往左移动。 每操作一次,参数向左移动一次。也可以一次移动两位,shift 2
- 根据退出状态来报告成功或者而失败, 只有0表示成功1-255都是失败
$? 变量保存最近的命令退出状态,前一次的执行的状态(
如果是系统变量脚本中执行的,是最有一次执行的结果, 如果是语法错误,则是整个脚本的返回结果) - ping -c1 172.168.0.123 &> /dev/null可以通过echo $?查看该命令执行的结果,如果是0 就表示执行成功了。
- exit(num), 执行结束后返回的值。在终端中执行,退出当前的bash进程
- bash中的算数运算 help let(查看帮助)
id++, id-- variable post-increment, post-decrement ++id, --id variable pre-increment, pre-decrement -, + unary minus, plus !, ~ logical and bitwise negation ** exponentiation *, /, % multiplication, division, remainder +, - addition, subtraction <<, >> left and right bitwise shifts <=, >=, <, > comparison ==, != equality, inequality & bitwise AND ^ bitwise XOR | bitwise OR && logical AND || logical OR expr ? expr : expr conditional operator =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |= assignment
直接相加模式是默认是当做字符串的
使用方式:let z=x+y
var =$[算术表达式]
var =$((算术表达式))
var = $(expr arg1 arg2 arg3)
declare -i var = 数值,将变量声明为数字
echo `算术表达式` | bc
乘号需要转移\*
bash有内建的随机数生成器$RANDOM(0-32767)
ex: echo $[$RANDOM%50] 取0-49之间的随机数。
- COLOR=$[RANDOM%7+31] ;echo -e "\e[1;${COLOR}mcolor\e[0m"
随机打印其中颜色中的一种。 - XOR异或:互斥的原则,相同为0 ,不同为1, 按位异或。
可以用来进行值的互换a=a^b, b=a^b, a=a^b ,则a和b的值就能互换。 - bash -x test.sh单步执行文件,看打印调试信息
第四节P4
一、条件测试:
-
help test 查看使用帮助
-
判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成测试过程
-
测试命令:
test expersion表达式,判断某需求是否满足,由测试机机制来实现,是内置的命令
用法举例: test $str1 = $str2,真返回0, 假返回1. -
方法2: [$str1 = $str2] 注意等号前后一定要有空格
-
方法2 [[expresion表达式]], 这里用的是两个中括号。一般用到正则表达式的时候用两个中括号。
-
参数说明:
-v VAR :变狼VAR是否设置
-gt 是否大于
-ge 是否大于等于
-eq 是否等于
-ne 是否不等于
-lt 是否小于
-le 是否小于等于
-z判断存的变量是否为零,-n非零判断 或者[ $var ] 直接判断var是否是非空。有值则返回0, 表示为真。 -
短路或 || 与短路于&&的用法,以及三目运算符的用法,用之前思考一下就可以。
-
如果是用来判断数字是否相等的[ $m -eq $n ]中间加上-eq来进行比较, 直接使用等号= 比较的是字符串。
-
变量在[ “$a“ = ”$b”']使用的使用将变量用双引号引起来, 记住是双引号,不是单引号。
-
字符串测试
= 是否等于
> < !=不等于
-z "string" 字符串是否为空, 为空则为真,不为空,则为假
-n "string" 字符串是否不为空,不为空则为真,为空则为假。
注意:用于字符串比较时候的用到的操作数都应该使用双引号。 -
=~左侧的字符是否能够被右侧的正则表达式PATTERN所匹配。
[[ "$n" =~ ^[[:digit:]]+$ ]] && echo digit || echo no digit -
test 语句支持判断文件的操作,help test查看具体的用法
-
fale || { echo cmd1; echo cmd2} 或者false || (echo cmd2; echo cmd2)
{} 与()区别,小括号会再开一个子进程,不会退出当前的进程,{不开启子进程,退出当前进程}
所有脚本中尽量用{ 大括号 },大括号前后要有空格。
第五节P5
一、条件测试
- echo -e "stting \c" 取消换行
二、文件测试
- -a File 同 -e,
- -e File , 文件存在行测试,存在为真,不存在为假
- -b File 是否存在且为块设备的文件
- -c File 是否存在且为字符设备文件
- -d File 是否存在且为目录文件
- -f File 是否存在且为普通文件
- -h File 或者-L File 存在且为符号链接文件
- -p File 是否存在且为命名管道文件
- -S File 是否存在且为套接字文件
- -s File 是否存在且为空
- -t fd fd文件描述符是否在某终端已经打开
- -N File 文件自从上一次被读取之后是否被修改过
- -O File 当前有效用户是否为文件属主
- -G File 当前有效用户是否为文件属组
- 双目测试
File1 -ef File2 File1是否是File2的硬链接
File1 -nt File2 File1是否新于File2
File1 -ot File2 File1s是否旧于File2
三、 read命令用来接受输入
- 使用read来把输入值分配给一个或者多个shell变量
- read,对变量复制 read $var1
- read -p 指定要显示的提示,不换行输入
- -s 静默输入,一般用于密码的输入
- -n n指定输入字符的长度,到这个长度,输入自动结束
- -d ‘a’ 输入结束符,碰到a字符就结束输入
- -t Time, Time为超时等待时间S
- read从标准输入中读取值,给每个单词分配一个变量,把剩余的单词都分配给最后一个变量中
四、总结
- 变量: 局部变量和环境变量, 位置变量$、set、 unset 、declear (-i -r -s等参数)
- 常用命令