Linux 第17天
时间: 20180803
目录
脚本测试
$-变量作用
bash的配置文件
忘记的内容回顾
命令历史
命令历史调用
bash算术运算help let
管道重定向
正则表达式和扩展表达式元字符
find命令的使用
脚本测试
[ X"$var = X"$var" ] 此种方式可以避免变量出现空值时提示语法错误
[ "$name" = "$test"] 此种方式也是为了避免变量出现空值,但是如果两个变量都空时会为真
[[ "$var" =~ EXPR ]] 支持扩展正则表达式匹配,后边的正则不可加引号
脚本不支持别名: 脚本内不可以执行命令的别名
read 和用户交互式为某变量赋值
-p 在为变量赋值时,增加一个提示字符串
-n 指定变量的字符长度,当用户输入字符长度达到时自动保存至变量,而不是等到用户按回车
-s 用户输入时不会显示用户所输入的字符,一般用于设置密码
-d 指定结束符号,当输入所指定的结束字符时,自动保存字符串至变量中
-t 指定等待时间,当用户长时间未输出字符时,自动退出交互界面,变量为空值
$-变量作用
此变量是一个监控变量,可以显示当前bash的配置情况
echo $- 会显示一个字符串,每个字符代表bash开启的功能
h hashall 有此字符表示shell会将命令所在的路径hash下来,避免每次都要搜索硬盘路径
通过set +h 将h选项关闭
i interactive-comments 包含这个选项说明当前的shell是一个交互式的shell。所谓的交互
式shell,在脚本中, i选项是关闭的
m monitor 打开监控模式,就可以通过job control来控制进程的停止、继续、后台或前台
执行 bg fg
B braceexpand 大括号{}展开,如果关闭后则大括号将会被当作普通的字符串来识别
H history H选项打开,可以展开历史列表中的命令,可以通过!执行其历史命令,
如果关闭后则不可以执行。 set +|- H
bash的配置文件
按生效范围划分,存在两类
全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
个人配置:
~/.bash_profile
~/.bashrc
按功能划分存在两类
profile类: 为交互式登录的shell提供配置
全局: /etc/profile /etc/profile.d/*.sh
个人: ~/bash_profile
功用: 定义环境变量 运行命令或脚本
bashrc类: 为非交互式和交互式登录的shell提供配置
全局: /etc/bashrc
个人: ~/.bashrc
功用: 定义命令别名和函数 定义本地变量
shell登录时读取配置文件的顺序
交互式登录
1) 直接通过终端输入账号密码登录
2) 使用"su - User" 切换的用户
执行顺序: /etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile
--> ~/.bashrc --> /etc/bashrc
非交互式登录
1) su UserName
2) 图形界面下打开的终端
3) 执行脚本
4) 任何其它的bash实例
执行顺序 ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
bash退出任务
当用户退出登录时会读取并执行此文件~/.bash_logout
功用: 创建自动备份 清除临时文件等
locate 通过数据库来查找系统里的文件cent7最小安装已经废弃此软件包mlocate
-i ignore case 忽略字符大小写
-n 后边跟一个数值表示显示所匹配到的前#个文件
-r 后边可以跟一个基本正则表达式来搜索文件
updatedb 此命令用来更新文件查询数据库,如果系统有生成新文件时可以使用此命令来更新
数据库
忘记的内容回顾
命令历史
!! 执行上一条命令
!-1 执行上一条命令
!n 执行history命令输出对应序号n的命令
!-n 执行history命令历史中倒数每n个命令
!string 重复前一个以"string"开头的命令
!?string 重复前一个包含"string"的命令
!string:p 仅打印命令,而不执行
!$:p 打印出!$(上一条命令的最后一个参数)的内容
!*:p 打印输出!*(上一条命令的所有参数)的内容
^string 删除上一条命令中第一个string
^string^string2 将上一条命令中的第一个string1替换为string2
!:gs/string1/string2 将上一条命令中所有所有string1都替换为string2
历史命令调用
Ctrl+r 可以搜索包含某个字符串的历史命令
Ctrl+g 从命令历史搜索模式退出
command !^ 调用上一条命令的第一个参数作为command的参数
command !$ 调用上一条命令的最后一个参数作为command的参数
command !* 调用上一条命令的全部参数作为command的参数
command !:n 调用上一条命令的第n个参数作为command的参数
command !n:^ 调用第n条命令的第一个参数作为command的参数
command !n:$ 调用第n条命令的最后一个参数作为command的参数
command !n:m 调用第n条命令的第m个参数作为command的参数
command !n:* 调用第n条命令的所有参数作为command的参数
bash算术运算help let
+, -, *, /, %取模, **乘方
实现算术运算的语法
a=5 b=8
1) let c=$a+$b
2) c=$[$a+$b]
3) c=$(($a+$b))
4) c=$(expr $a + $b)
5) echo $a+$b|bc
乘法符号有些场景中需要转义在其前方加\
管道重定向
> 将标准输出重定向至文件中覆盖其原有内容
>> 将标准输出重定向至文件中但不会覆盖其原有内容,追加在其之后
2> 将错误输出重定向至文件中覆盖其原有内容
2>> 将错误输出重定向至文件中但不会覆盖其原有内容,追加在其之后
&> 将标准和错误输出重定向至文件中覆盖其原有内容
&>> 将标准和错误输出重定向至文件中但不会覆盖其原有内容,追加在其之后
2>&1 将错误输出转至标准输出
1>&2 将标准输出转至错误输出
示例 ls abc >f1 2>&1
正则表达式和扩展表达式元字符
标准正则表达式
字符匹配
. 任意单个字符
[] 匹配括号内任一单个字符
[^] 匹配除了括号内的任一单个字符
[:alnum:] 字母和数字
[:alpha:] 大小写字母
[:upper:] 大写字母
[:lower:] 小写字母
[:digit:] 数字
[:punct:] 标点符号
[:print:] 可打印字符
[:space:] 空格
[:blank:] 空白字符
次数匹配
* 匹配前方字符任意次包含0次
\? 匹配前方字符0或1次
\+ 匹配前方字符至少1次
\{n\} 匹配前方字符n次
\{n,\} 匹配前方字符至少n次
\{n,m\} 匹配前方字符至少n次,最多m次
\{,m\} 匹配前方字符最多m次
位置锚定
^ 行首
$ 行尾
\< or \b 词首
\> or \b 词尾
或
\| 表示匹配前边或后边的模式之一
分组
\(\) 将一组表达式括起来可以将其用来后向引用
需要注意后向引用是引用前方的分组括号中的模式所匹配的字符,非模式本身
扩展正则表达式
字符匹配
. 匹配任一单个字符
[] 匹配括号内任一单个字符
[^] 匹配除了括号内任意单个字符
次数匹配
* 匹配前方字符任意次包含0次
? 匹配前方字符0或1次
+ 匹配前方字符至少1次
{n} 匹配前方字符n次
{n,} 匹配前方字符到少n次
{n,m} 匹配前方字符至少n次,最多m次
{,m} 匹配前方字符最多m次
位置锚定
^ 匹配行首
$ 匹配行尾
\< or \b 匹配词首
\> or \b 匹配词尾
或
| 表示匹配前边或后边的模式之一
分组
() 将一组表达式括起来可以将其用来后向引用
基本正则和扩展正则区别
In basic regular expressions the meta-characters ?, +, {, |,
(, and ) lose their special meaning; instead use the backslashed
versions \?, \+, \{, \|, \(, and \).
默认的基本正则?, +, {, |, (, ),在shell中有特殊意义所以在其前方加上\将其
转义,即不被shell所识别为特殊字符。而扩展正则做了优化使其可以直接使用这些
字符,而不会被shell所识别为特殊含义的字符。
find 搜索文件系统上的文件或文件夹
-maxdepth LEVEL 最大搜索目录深度,指定目录为第1级
-mindepth LEVEL 最小搜索目录深度
-iname 搜索文件名时不区分大小写
-regex "pattern" 以pattern匹配整个文件路径字符串,而不仅仅是文件名称
-empty 搜索空文件或空目录
fine /app -type d -empty
-perm +|-#
# 表示精确匹配所给的权限
如 -perm 644 则精确匹配文件权限为644的文件或文件夹
/# 表示匹配所给权限中的一组即可
如 -perm /644 则匹配文件权限属主大于6或属组大于4或其它大于4的文件或
文件夹
-# 表示匹配所给权限中的每一位
如 -perm -644 则匹配文件权限属主至少6并且属组至少为4其它为4的文件或
目录
/|- 664 110 110 100
/ 110 110 100 表示1关心0不关心有无都可以 每1组之间为或关系
可以匹配的有 777, 600, 060, 004等只要有一组满足即可
- 110 110 100 表示1关心0不关心有无都可以 每1组之间为与关系
可以匹配的有664, 764, 667, 665等三组权限同时大于664就满足
-atime # 单位是天
# 表示 [#,#+1) 此种方式用的不多,一般+-用的比较多
如 -atime 5 表示5天前到6天之内被访问的过的文件
+# 表示 [#+1,无穷大)
如 -atime +5 表示6天(包含每6天)之前被访问过的文件
-# 表示 (#,now)
如 -atime -5 表示6天之内被访问过的文件
-ctime
-mtime
-amin # 单位是分钟
-cmin
-mmin
-size +|- #UNIT
#UNIT (#-1,#]
如5K 表示 (4K,5] 匹配4k-5K大小的文件
-#UNIT [0,#-1]
如-5K 表示 [0,4K] 表示匹配小于等于4K大小的文件
+#UNIT
如+5K 表示 (5K,无穷大) 表示匹配大于5K大小的文件
-prune
查找/etc/下,除/etc/sane.d和/etc/fonts两个目录的所有.conf后缀的文件
find /etc \(–path '/etc/sane.d' –o –path '/etc/fonts' \) \
-a -prune –o -name "*.conf"
原文地址:http://blog.51cto.com/winthcloud/2154650