bash的基础特性:
bash中的变量的种类:
根据变量的生效范围等标准:
本地变量:生效范围为当前shell进程:只对当前shell进程有效,当前shell的子shell进程均无效
环境变量:生效范围为当前shell进程及其子进程,对其他shell无效(定义:declare -x)
局部变量:生效范围为当前shell进程中某代码片段(通常指函数)
位置变量:$1,$2....来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
本地变量:
显示已定义的所有变量
set
销毁变量:
unset name
环境变量:
变量申明、赋值:
export name=VALUE
declare -x name=VALUE
显示所有环境变量
export
env
销毁变量:
unset name
bash有许多内建的环境变量
变量命名法则:
1、不能使用程序中的保留字:例如if、for;
2、只能使用数字、字母及下划线,且不能以数字开头;
bash的配置文件:
按生效范围划分,存在两类:
全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
个人配置:
~/.bash_profile
~/.bashrc
按功能划分,存在两类:
profile类:为交互式登录的shell提供配置
bashrc类:为非交互式登录的shell提供配置
shell登录:
交互式登录:
直接通过终端输入账号密码登录;
使用"su - UserName"或"su -l UserName"切换的用户
非交互式登录:
su UserName
图形界面下打开的终端
执行脚本
实现算术运算:
let var=算术表达式
bash有内建的随机数生成器:$RANDOM
自增、自减
let var+=1
let var++
let vat-=1
let var--
练习:写一个脚本
1、计算/etc/passwd文件中的第10个用户和第20用户的ID之和:
#!/bin/bash
userid1=$(head -10 /etc/passwd | tail -1 | cut -d: -f3)
userid2=$(head -20 /etc/passwd | tail -1 | cut -d: -f3)
uidnum=$[$userid1 + $userid2]
echo "uid sum: $uidnum"
2、计算/etc/rc.d/rc.sysinit及/etc/rc.d/init.d/functions文件中所有空白行之和
#!/bin/bash
spaceline1=$(grep "^[[:space:]]*$" $1 | wc -l) #$1为位置变量,在命令行中赋予参数
spaceline2=$(grep "^[[:space:]]*$" $2 | wc -l) #$2为位置变量,在命令行中赋予参数
echo "The sum of space lines: $[$spaceline1+$spaceline2]"
执行时#bash b /etc/rc.d/rc.sysinit /etc/rc.d/init.d/functions
The sum of space lines: 174
3.统计/etc,/var,/usr目录共有多少个一级子目录和文件:
#!/bin/bash
etc=`ls /etc | wc -l`
var=`ls /var | wc -l`
usr=`ls /var | wc -l`
num=$[$etc+$var+$usr]
echo "All file : $num"
vim编辑器
定制vim的工作特性
配置文件:永久有效
全局:/etc/vimrc
个人:~/.vimrc
末行模式:当前vim进程有效
(1) 行号
显示:set nu
取消显示: set nonu
(2) 括号匹配
匹配:set sm
取消:set nosm
(3)自动缩进
启用:set ai
禁用:set noai
(4)高亮搜索
启动:set hlsearch
禁用:set nohlsearch
(5)语法高亮
启用:syntax on
禁用:syntax off
(6)忽略字符的大小写
启用:set ic
不忽略:set noic
练习:
1、复制/etc/grub.cfg至/tmp目录,用查找替换命令删除/tmp/grub.cfg文件中的行首的空白字符
:%s/^[[:space:]]\+//
2、复制/etc/rc.d/init.d/functions文件至/tmp目录,用查找替换命令为/tmp/function的每行开头为空白字符的行的行首添加一个#号;(增加用“&”)
:%s/^[[:space:]]/#&/
3.复制/etc/rc.d/init.d/functions文件至/tmp目录,替换命令为/tmp/function中的/etc/sysconfig/init为/var/log;
:%s/\/etc\/sysconfig\/init/\/var\/log/
4.删除/tmp/functions文件中所有以#开头,且#后面至少有一个空白字符的行的行首的#
:%s/^#\+[[:space:]]\+//
bash条件测试
测试方式:
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
文件测试:
存在性测试:
-e FILE:文件存在性测试,存在则为真,否则为假 用echo $?的返回值来判断真假
存在性及类别测试:
-b FILE:是否存在且为块设备文件
-c FILE:是否存在且为字符设备文件
-d FILE:是否存在且为目录文件
-f FILE:是否存在且为普通文件
-h FILE:是否存在且为符号链接文件
-p FILE:是否存在且为命名管道文件
-S FILE:是否存在且为套接字文件
文件权限测试:
-r FILE:是否存在且可读
-w FILE:是否存在且可写
-x FILE:是否存在且可执行
文件特殊权限测试
-g FILE:是否存在且拥有sgid权限
-u FILE:是否存在且拥有suid权限
-k FILE:是否存在且拥有sticky权限
文件大小测试:
-s FILE:是否存在且非空
组合测试条件:
逻辑运算:
第一种方式:
COMMMAND1 && COMMMAND2 且
COMMMAND1 || COMMMAND2 或
!COMMAND 取反
[ -e FILE ] && [ -r FILE ]
第二种方式:
EXPRESSION1 -a EXPRESSION2 且
EXPRESSION1 -o EXPRESSION2 或
!EXPRESSION 取反
必须使用测试命令进行:
例:定义变量
hostName=hostname
[ -z "$hostName" -o "$hostName"=="localhost.localdomain" ]
find
find find 路径 表达式
-name 查找某个指定文件
-iname 查找时不区分大小写
-size n 查找n值大小的文件 + 表示大于 默认单位是块(1块=512字节)
-empty 查找空文件 备注:写入一个10M大小的文件 dd if=/dev/zero of=文件名 bs/M(单位)=count=10
-user 用户名 查找属于指定用户的文件
-group 组名 (指定用户组)
-nouser 没有属主的文件
-nogroup 没有属组的文件
-newer 文件名 查找比文件更新的文件
-anewer 访问时间
-cnewer 修改时间
-amin n 查n分钟前访问过的文件
-cmin n 查n分钟前状态改变过的文件
-mmin n 查n分钟前修改过的文件
-atime n n天前
-used n 查n天使用的文件 -表示在内 +表示之前
-fstype 文件系统类型 在指定文件系统类型上查找文件
-perm 权限 查找指定的权限
-exec command {} \; 找到文件后执行命令
查找后缀为bak的文件并删除
find / -name ‘*.bak’ -exec rm {} \; 或者 find / -name ‘*.bak’|xargs rm -rf
-link n 查找n个硬链接数的文件 大于2 加s links
-inum i节点ID 查找指定的i节点号
根据文件类型查找:
-type TYPE: 查找指定类型的文件 类型文件
l:符号链接文件
d:目录文件
b:块设备文件
s:socket(套接字)
p:管道(pipe)
f:常规文件
组合条件:
与:-a
或:-o
非:-not
例如: !A -a !B = !( A -o B )
!A -o !B = !( A -a B )
找出/tmp目录下,属主不是root,且文件名不是fstab的文件
find /tmp -not \( -user root -o -name fstab \) -ls
find /tmp \( -not -user root -a -not -name fstab \) -ls
根据文件大小来查找
-size [+|-]#(UNIT数字)
常用单位:k,M,G
find /var -size # 表示(#-1,#]
例 find /var -size 3k #表示大于2k小于等于3k
find /var -size -# 表示[0,#-1]
例 find /var -size -3k #表示大于等于0k,小于等于2k
find /var -size +# 表示(#,∞)
例 find /var -size +3k #表示大于3k
根据时间戳:
以”天“为单位:
-atime [+|-]# 查n天访问过的文件
#:[#,#+1)
+#:[#+1,∞]
-#:[0,#)
-mtime [+|-]# 查n天修改过的文件
-ctime [+|-]# 查n天状态改变过的文件
以“分钟”为单位:
-amin [+|-]# 查n分钟访问过的文件
-mmin [+|-]# 查n分钟修改过的文件
-cmin [+|-]# 查n分钟状态改变过的文件
根据权限查找:
-perm [/|-]MODE
MODE:精确权限匹配
/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可
例:find ./ -perm +222 表示为寻找当前目录下属主或属组或其他有读权限的文件
-MODE:每一类对象都必须同时拥有为其指定的权限标准
例如 find ./ -perm -666 表示三类对象必须都拥有读写权限。766、777有多出权限也符合,只要拥有读写即可。
处理动作:
-print:默认的处理动作,显示至屏幕;
-ls:类似于对查到到的文件执行“ls -l”命令;
-delete:删除查找到的文件;
-fls /path/to/somefile:表示查找到的所有文件的长格式信息保存至指定文件中;
-ok COMMAND {} \; 对查找到的每个文件执行有COMMAND指定的命令;
对于每个文件执行命令之前,都会交互式要求用户确认;
-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令;
{}:用于引用查找到的文件名称自身
注意:fing传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令;有些命令不能接受过多参数,此时命令执行可能会失败,另一方式可规避此问题;
find | xargs COMMAND
练习:
1.查找/usr目录下不属于root或bin的所有文件或目录;
find /usr -not -user root -a -user bin
find /usr -not \( -user root -o -user bin \)
2.寻找当前系统没有属主、属组,且最近一周内曾被访问过的文件或目录;
find / -nouser -a -nogroup -a -atime -7
3.查找/etc目录下所有用户都没有写权限的文件
find /etc -not -perm /222
4.查找/etc目录下至少有一类用户没有执行权限的文件
find /etc -not -perm -111
5.查找/etc/init.d目录下,所有用户都有执行权限,且其他用户有写权限的文件
find /etc/init.d -perm -113