linux系统的控制是由内核操纵资源分配使用的,shell命令是与内核操作通信交流的工具。shell有多种类型,常见的/bin/sh、/bin/bash,在centos环境中 默认使用bash,不建议使用其他形式的shell。
1)历史记录
bash shell在使用时,会自动记录所操作的命令,记录存放在.bash_history文件中。命名的历史记录默认记录最近1000条,可以通过profile设置HISTSIZE数值调整记录的长度,比如可以设置记录条数为一万/HISTSIZE=10000。当查询某一个使用过的命令,可以使用Ctrl+r快捷键开启命令搜索,但是在日常管理件建议直接使用history 或history|grep xxxx命令查找。
2) 快捷键
在命令行shell操作界面,命令行可以使用如下快捷键,提高操作效率。
Ctrl+a 光标移动到行首
Ctrl+e 光标移动到行尾
Ctrl+l 清屏
Ctrl+c 终止进程
Ctrl+z 挂起进程
Ctrl+u 删除光标到行首的字符
Ctrl+k 删除光标到行尾的字符
Ctrl+f 光标右移一个字符
Ctrl+b 光标左移一个字符
Ctrl+w 删除光标前一个字符
Alt+d 删除光标后一个字符
Tab 自动补齐
3)别名设置
linux允许用户根据自己的需求设置命令的别名。比如,ll这个命令是‘ls -l --color=auto‘的缩写,对复杂的命令设置别名,可以提高操作的效率。在命令行界面输入alias 可以查看已经设置的命令别名;例如设置别名: alias nginxstart=‘systemctl start nginx‘,nginxstart 就可以可以直接启动nginx了;取消别名:unalias nginxstart。
[root@centos7 yum.repos.d]# alias nginxstart=‘systemctl start nginx‘
[root@centos7 yum.repos.d]# alias
alias cp=‘cp -i‘
alias egrep=‘egrep --color=auto‘
alias fgrep=‘fgrep --color=auto‘
alias grep=‘grep --color=auto‘
alias l.=‘ls -d .* --color=auto‘
alias ll=‘ls -l --color=auto‘
alias ls=‘ls --color=auto‘
alias mv=‘mv -i‘
alias nginxstart=‘systemctl start nginx‘
alias rm=‘rm -i‘
alias which=‘alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde‘
[root@centos7 yum.repos.d]# unalias nginxstart
4)管道符---“|”
管道符的作用的是将多个命令连接起来使用,前一个命令的结果标准输出到下一个命令的标准输入。例如,cat /etc/passwd |grep bash命令可以筛选出具有bash登录权限的用户,直接cat查看passwd文件时候,输出的内容很多,不方便查看具有bash权限的信息,当加上管道|后,接着使用grep命令过滤cat输出的信息,最终筛选出带有bash的信息行。
5)重定向---“> ,>>”
重定向符号的作用是将命令的结果输出到指定的文件或位置。>是强制覆盖模式,没有文件会自动创建文件,有文件,会覆盖文件内容;>> 是追加模式输出到文件;命令末尾的数字也有特殊含义,0代表标准输入,1代表标准输出,2代表标准错误;2>&1 的意思是将标准错误重定向到标准输出;> /dev/null 是将输出写入到无穷尽的黑洞,用户无意思信息的处理。
[root@centos7 ~]# history > /tmp/1.txt
[root@centos7 ~]# cat /etc/nginx.conf >>/tmp/1.txt
[root@centos7 ~]# nohup ./rmlog.sh > rm.log 2>&1 &
[root@centos7 ~]# sh mysql.sh >/dev/null 2>&1
6)序列控制符---“&”
&是shell中常用的字符,在一个命令后面加&,表示放到后台运行;&&是可以连接两个命令,表示只有当前一个命令执行成功了才会接着执行后面的命令;||是表示当前面的命令执行失败了才会执行后面的字符。
[root@centos7 ~]# nohup /home/jiankong.sh & #后台不中断执行
7)引号
单引号可以用来还原字符的字面意思,实现屏蔽元字符的功能,单引号必须成对使用;双引号与单引号基本相同,但其不会屏蔽$ ‘ \这三个元字符的功能,如果要屏蔽,必须在其前面加一个\;反引号是进行命令替换,把命令字符替换为命令结果输出。
[root@centos7 ~]# echo ‘$JAVA_HOME‘ #实现屏蔽$的特殊功能
[root@centos7 ~]# echo ‘cd \home‘ #实现屏蔽转义字符
[root@centos7 ~]# echo "$JAVA_HOME" #双引号直接输出了变量
[root@centos7 ~]# echo "\$JAVA_HOME" #用\转义,直接输出了后面的字符
[root@centos7 ~]# echo "today is `date`" #直接输出date命令的结果
8)变量
变量有环境变量、普通变量、特殊变量。环境变量是一般指系统环境变量,只要包含用户、目录、路径、全局参数等主要信息,他们需要执行export声明才能使用,用env命令可以查看这些变量。普通变量主要是应用要调用参数的赋值。特殊变量是linux系统设置的特定参数变量。在日常的应用中最多是声明环境变量,脚本中也会常用赋值变量,特殊变量使用较少。下面是三种变量的示例。
java环境变量设置示例
[root@centos7 ~]# vim /etc/profile
JAVA_HOME=/usr/local/java
JRE_HOME=/usr/local/java/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
[root@centos7 ~]# source /etc/profile
脚本中常用的赋值变量示例
[root@centos7 ~]# starttime=`date`
[root@centos7 ~]# gameuser="lixiaoming"
[root@centos7 ~]# fr_1=‘12315‘
特殊变量释义
$0 获取脚本文件名
$n 获取第 n 个参数值,$1是第一个参数,$2是第二个参数...
$# 获取参数的总个数
$* 获取传参参数,"$*"表示将参数作为单字符串,以"$1 $2 ... $n"形式输出参数
$@ 获取传参参数,"$@"表示将参数视作为独立字符串,以"$1" "$2" "$3" ... "$n"形式输出参数
$? 获取上一命令的执行状态,0表示成功,其他为失败
$$ 获取当前脚本或命令的进程号
$! 获取最后一个后台进程的进程号
9)数组
数组是一种具有变量功能的数据结构,数组由元素组成,每个元素分配一个从零开始的整数索引。定义一个数组有两种方式,一种是逐一赋值定义,如TESTA[0]=100,TESTA[1]=200;另一种是全量赋值创建,如TESTB=(12 23 34 45),取值采用$TESTB[1]。下面用示例来加深对数组的理解。
root@centos7 ~]# TESTB=(12 23 34 45) #定义新数组
[root@centos7 ~]# echo ${TESTB[2]} #输出索引为2的元素值
[root@centos7 ~]# TESTB[4]=56 #增加索引为4的新元素
[root@centos7 ~]# echo ${TESTB[@]} #输出所有元素,空格分开元素值格式
[root@centos7 ~]# echo ${TESTB[*]} #输出所有元素,字符串格式
[root@centos7 ~]# echo ${#TESTB[@]} #输出数组的元素个数
[root@centos7 ~]# echo ${#TESTB[*]} #输出数组的元素个数
[root@centos7 ~]# TESTC=(${TESTA[@]} ${TESTB[@]}) #两个数组合并成新数组
10) 算术运算
Bash支持很多运算符,包括算数运算符、关系运算符、布尔运算符、字符串运算符和文件测试运算符。
1 算术运算
原生bash不支持简单的数学运算,但是可以通过expr命令来实现expr是一款表达式计算工具,它能完成表达式的求值操作
a=10
b=20
常用的算术运算符
+ 加法 `expr $a + $b` 结果为 30
- 减法 `expr $a - $b` 结果为 10
* 乘法 `expr $a \* $b` 结果为 200
/ 除法 `expr $b / $a` 结果为 2
% 取余 `expr $b % $a` 结果为 0
= 赋值 a=$b 将把变量 b 的值赋给 a
== 相等 用于比较两个数字,相同则返回 true,[ $a == $b ] 返回 false
!= 不相等 用于比较两个数字,不相同则返回 true,[ $a != $b ] 返回 true
注意:条件表达式要放在方括号之间,并且要有空格,例如[$a==$b]是错误的,必须写成[ $a == $b ]
2 关系运算符
运算符 说明 举例
-eq 检测两个数是否相等,相等返回 true [ $a -eq $b ] 返回 false
-ne 检测两个数是否相等,不相等返回 true [ $a -ne $b ] 返回 true
-gt 检测左边数是否大于右边,是返回 true [ $a -gt $b ] 返回 false
-lt 检测左边数是否小于右边,是则返回 true [ $a -lt $b ] 返回 true
-ge 检测左边数是否大等于右边,是则返回 true [ $a -ge $b ] 返回 false
-le 检测左边数是否小于等于右边,是则返回 true [ $a -le $b ] 返回 true
3 布尔运算符
运算符 说明 举例
! 非运算,表达式为true则返回false,否则返回true [ ! false ] 返回 true
-o 或运算,有一个表达式为true则返回true [ $a -lt 20 -o $b -gt 100 ] 返回 true
-a 与运算,两个表达式都为true才返回true [ $a -lt 20 -a $b -gt 100 ] 返回 false
4 字符串运算符
运算符 说明 举例
= 检测两个字符串是否相等,相等返回 true [ $a = $b ] 返回 false
!= 检测两个字符串是否相等,不相等返回 true [ $a != $b ] 返回 true
-z 检测字符串长度是否为0,为0返回 true [ -z $a ] 返回 false
-n 检测字符串长度是否为0,不为0返回 true [ -n $a ] 返回 true
str 检测字符串是否为空,不为空返回 true [ $a ] 返回 true
5 文件测试运算符
操作符 说明 举例
-b file 检测文件是否是块设备文件,如果是,则返回 true [ -b $file ] 返回false
-c file 检测文件是否是字符设备文件,如果是,则返回 true [ -b $file ] 返回false
-d file 检测文件是否是目录,如果是,则返回 true [ -d $file ] 返回false
-e file 检测文件或目录是否存在,如果是,则返回 true [ -e $file ] 返回true
-f file 检测文件是否是普通文件,如果是,则返回 true [ -f $file ] 返回true
-g file 检测文件是否设置了SGID位,如果是,则返回 true [ -g $file ] 返回false
-h file 检测文件是否为链接文件,如果是,则返回 true [ -h $file] 返回false
-k file 检测文件是否设置了粘着位(如果是,则返回 true [ -k $file ]返回false
-p file 检测文件是否是具名管道,如果是,则返回 true [ -p $file ] 返回false
-u file 检测文件是否设置了SUID位,如果是,则返回 true [ -u $file ] 返回false
-r file 检测文件是否可读,如果是,则返回 true [ -r $file ] 返回true
-w file 检测文件是否可写,如果是,则返回 true [ -w $file ] 返回true
-x file 检测文件是否可执行,如果是,则返回 true [ -x $file ] 返回true
-s file 检测文件是否为非空,不为空,返回true [ -s $file ] 返回true
11)正则表达基础
1 正则常用的命令工具
grep、egrep、sed、awk
2 基本的正则表达符号含义
d 匹配字母d
. 匹配任意单个字符
* 匹配一个或多个
.* 匹配任意多个字符
^ 匹配字符串的开头
$ 匹配字符串的结尾
[] 匹配集合中的任意单个字符
[^] 匹配否定,对括号中的集合取反
[x-y] 匹配x到y连续的字符串范围
\ 匹配转义后的字符串
\{n,\} 匹配前一个字符重复至少n次
\{n\} 匹配前一个字符重复n次
\(\) 调用\( 和 \)之间的内容
3 校验字符的表达式
1 汉字: ^[\u4e00-\u9fa5]{0,}$
2 英文和数字: ^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
3 长度为3-20的所有字符: ^.{3,20}$
4 由26个英文字母组成的字符串: ^[A-Za-z]+$
5 由26个大写英文字母组成的字符串: ^[A-Z]+$
6 由26个小写英文字母组成的字符串: ^[a-z]+$
7 由数字和26个英文字母组成的字符串: ^[A-Za-z0-9]+$
8 由数字、26个英文字母或者下划线组成的字符串: ^\w+$ 或 ^\w{3,20}$
9 中文、英文、数字包括下划线: ^[\u4E00-\u9FA5A-Za-z0-9_]+$
10 中文、英文、数字但不包括下划线等符号: ^[\u4E00-\u9FA5A-Za-z0-9]+$
11 可以输入含有^%&‘,;=?$\"等字符: [^%&‘,;=?$\x22]+
12 禁止输入含有~的字符: [^~\x22]+
4 特殊需求表达式
Email地址: ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
域名: [a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
InternetURL: [a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
手机号码: ^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
国内电话号码(0511-4405222、021-87888822): \d{3}-\d{8}|\d{4}-\d{7}
15或18位×××: ^\d{15}|\d{18}$
15位×××: ^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$
18位×××: ^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$
短×××号码(数字、字母x结尾): ^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线): ^[a-zA-Z][a-zA-Z0-9_]{4,15}$
密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线): ^[a-zA-Z]\w{5,17}$
强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间): ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
日期格式: ^\d{4}-\d{1,2}-\d{1,2}
一年的12个月(01~09和1~12): ^(0?[1-9]|1[0-2])$
一个月的31天(01~09和1~31): ^((0?[1-9])|((1|2)[0-9])|30|31)$
腾讯QQ号: [1-9][0-9]{4,} (腾讯QQ号从10000开始)
中国邮政编码: [1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
IP地址: \d+\.\d+\.\d+\.\d+ (提取IP地址时有用)