正则表达式符号
. 任意的一个字符
* 前边字符重复任意次
(cui)* 前边单词重复任意次
X+ 加号前边字符重复1次以上
X{1,} 表1次
X{1,8} 最少一次最多8次
X{,n} 最多几次
X?表0次
X{m} 精确匹配多少次
^ 行首(中括号外)
$ 行尾
< 单词的词首
> 单词的词尾
[wang] w a n g 中括号里面的任意一个字符
[^.] 中括号里面 ^ 表示除了 除了. 的任意字符
a|buy a或buy
(a|b)uy auy或buy
(epr) (epr2) 1 2 匹配完的结果 第一个 第二个
执行权限
执行脚本: 【hello.sh】
①有执行权限 chmod +x hello.sh
相对路径 ./hello.sh
②没有执行权限也想执行
bash hello.sh
cat hello.sh |bsah
③直接执行 hello.sh 即可
echo $PATH --把文件放到任何PATH目录下即可
[root@localhost date]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost date]#chmod +x hello.sh
[root@localhost date]# mkdir /root/bin
[root@localhost date]# mv hello.sh /root/bin/
[root@localhost date]# hello.sh
[root@localhost date]# hash
执行后脚本文件会 hash到内存里面,一旦将PATH下的文件换个目录,重新执行hello.sh 将找不到文件;
需要删除hash文件路径:hash -d hello.sh ;即可
脚本调试:
检测脚本中的语法错误:bash -n f1.sh -n 只检测语法
bash -x f1.sh 跟踪执行逻辑问题
变量的使用
定义变量若值等于命令如:hostname,使用反引号引用。
例:① name=`hostname` ②name=`cat/etc/fstab`
echo $name 数据多的话格式会有问题,所有数据都在一行
echo "$name" 保留格式
变量:字符串、数字
shell里可以直接赋值,无需指定数据类型。
变量名不能使用数字作为开头。
变量:$ 带$则是变量名
引用变量需要加 $
echo $PATH
bash中变量的种类:
局部变量:当前session有效
echo $$ 当前进程的进程编号
echo $PPID 当前进程的父进程编号
pstree -p 查进程树 centos最小安装不能直接使用该命令,需安装psmisc
局部变量只在当前bash运行
$SHLVL 查看shell嵌套了几层
环境变量:全局变量
name=hello
echo $name
export name 向子进程声明环境变量 or exoport name=hello
exportenv 可以查看系统里的环境变量
unset name 删除变量名释放内存
env-->export :查看系统里的环境变量
变量的分类
只读变量-->常量声明
readonly name =hello 只能使用不能修改,不可unset exit 退出程序常量消失
declare -r =readonly -p 系统自带常量
() 命令放小括号里,一次性任务,开启子shell,可以定义一次性变量,结束后不影响环境
{}大括号影响当前shell环境
位置变量
$1 $2 $3 表示 $*为多个参数
执行脚本后边跟的$1 $2 $3 等
scp 远程复制文件 scp f1 wang@192.168.8.12:/root/bin ps:非root用户,目标路径的所有者为wang用户
复制当前目录下的文件,到对方主机wang用户@对方地址:、对方目录
将对方主机、用户、路径写入脚本scp.sh,需要传输的文件作为变量.
!#/bin/bash
echo "start copy......"
scp $1 root@192.168.8.12:/root/bin
echo "copy is finished"
执行脚本:scp.sh /etc/aaa --$1的位置参数 $* 后边可以跟多个文件
位置参数$* 跟 $@ 的区别:使用时需要用""引号引起来。
$*:传递给脚本的所有参数,全部参数合为一个字符串。
$@:传递给脚本的所有参数,每个参数为独立字符串。
$0:命令本身
$#:传递给脚本的参数个数。
ln -s scp.sh link.sh 创建scp.sh 的软连接为link.sh 执行link.sh $0 显示为link.sh
使用软连接做到同一个脚本,不同功能。
例如:
[root@localhost ~]# which pidof
/usr/sbin/pidof
[root@localhost ~]# ll /usr/sbin/pidof
lrwxrwxrwx. 1 root root 18 Nov 13 19:06 /usr/sbin/pidof -> /usr/sbin/killall5
[root@localhost ~]# /usr/sbin/pidof bash --软连接执行bash 返回的结果
2005 621
[root@localhost ~]# /usr/sbin/killall5 bash --源文件执行bash返回的结果
killall5: only one argument, a signal number, allowed
执行结果不一致也就是$0为不同结果时,可以实现不同效果,不同值可以做不同功能。
算数运算
算数的使用方法
①let z=x+y echo $z ② z =$[x+y] ③z = $((x+y)) ④expr 3 + 4 *expr是个命令
echo $? 值为0是真,值为1是假
& 并且 | 或者
&& 短路 与 【逻辑关系:如果 cmd1 && cmd2 ,cmd1为假,cmd2不需要执行,反之cmd1为真,需要cmd2执行】
|| 短路 或 【逻辑关系:如果cmd1 || cmd2 ,cmd1为真cmd2不需要执行,反之cmd1 为假,需要cmd2执行】
小练习:编写脚本 /root/bin/sumid.sh 计算/etc/passwd 文件中第十个用户和第20个用户的ID之和
#!/bin/bash
a="`head -n10 /etc/passwd | tail -n1 | cut -d: -f3`"
b="`head -n20 /etc/passwd | tail -n1 | cut -d: -f3`"
let c=a+b