shell的功能
- 自动补全
yum -y install bash-completion
- 查看历史命令
history #查看所有历史命令
history -n #查看最近的n条命令
history -d n #删除第n条命令记录
!n #执行第n条命令
!-n #执行底数第n条命令
- 别名功能
alias h20 = 'head -20' #创建别名,以后就可以用h20 代替后者
unalias h20 #取消别名
#让别名永久生效
vim ~/.bashrc
alias h ='cd /' #添加别名
#然后退出
source ~/.bashrc #刷新文件
bash初始化
环境变量的加载
-
/etc/profile:
-
/etc/bashrc:
-
~/.profile:
-
~/.bash_login
-
~/.bash_profile
-
~/.bashrc
-
~/.bash_logout
加载顺序
图形化界面登录时:1 =>3
图形化界面登录后:打开终端时:2=> 5
文本界面登录时: 2 => 1=>5
su进行用户切换:2=>1=>5
常用命令
command & #让作业进入后台运行
ctrl + z #将当前作业切换到后台
jobs #查看后台作业状态
fg %n #将后台运行作业n切换到前台
bg %n #让指定的作业n在后台运行
重定向
文件描述符
0:标准输入文件
1:标准输出
2:标准错误输出文件
输出重定向:
command >file #将结果以覆盖的方式写入文件(重定向符号前面没写就默认是1)
command >>file #将结果以追加的方式写入文件
command 2>>file #将command错误信息以追加的方式写入文件
command >file 2>&1 #以覆盖的方式将正确结果和错误信息同时写入同一个文件
command >>file 2>&1 #以追加的方式将正确和错误的结果同时追加到同一个文件中
&表示的是标准标准正确和错误的集合,
&1指的是标准正确通道,
&2指的是标准错误通道,
/dev/null相当于Linux中的回收站,对于一些不必要的信息可以全部重定向到该目录中,放入的垃圾不可恢复;
输入重定向:
command <file #将file文件中的内容作为command的输入
command <<END #从标准输入中读取数据,知道遇见分界符END才停止(分界符可自定义)
#案例
while read str
do
echo $str
done < readme.txt #实现将readme.txt中的语句一行一行的输出。
mysqladmin -uroot -p 123 test <test.sql #实现将test.sql中文件内容写到test中
tee
主要是用于将前面结果展示到前端的同时,也可以写入到文件中
cat /etc/profile | tee test.txt #将/etc/profile中的内容展示到前台,同时写入test.txt文件中(值得注意的是:写入文件的方式是覆盖整个文件,如果想以追加的方式写入,就用tee -a)
命令排序
&& 、|| 实现逻辑判断
&&:表示只有符号前面的命令执行成功后才会执行符号后面的语句
systemctl mysqld start && mysql -uroot -p xxx #只有mysql启动成功才会执行登录命令
||:表示符号前面的命令没有执行成功才会执行符号后面的语句
sl || yum install sl #如果sl这个命令使用不成功,就会去安装sl这个命令
; 不具备逻辑判断,只是连接两条命令
编程中正常用法
通配符(和正则略有不同)
*: #匹配0个或者多个任意字符(想起mysql模糊查询的%了吗?)
ls /etc/*.conf #匹配/etc/下面所有以.conf结尾的文件
?: #匹配一个任意字符
ls /etc/???.conf #匹配/etc/下面所有以.conf结尾并且文件名长度是3的文件
[list]: #匹配list中任意单个字符
ls /etc/[list].conf #匹配/etc/下面所有以.conf结尾并且文件名在list中的某个文件
[!list]: #匹配除list中的任意单个字符
ls /etc/[!list].conf #匹配/etc/下面所有以.conf结尾且文件名不在list中的某个文件
[c1-c2]: #匹配c1-c2间的任意单个字符
ls /etc/[c1-c2].conf #匹配/etc/下面所有以.conf结尾且文件名在c1-c2中的某个文件
{string1,string2,......}: #匹配string1,string...中的任意一个字符。
ls /etc/{"1","2","3"}.conf #匹配/etc/下面所有以.conf结尾且文件名不在在{"1","2","3"}中的文件的某个文件
shell规范
#1.开头必须执行解释器 通过`#!`指定
cat /etc/Shells #默认支持的解释器查看:
/bin/sh
/bin/bash
/user/bin/sh
/user/bin/bash
#2.注释使用
`#`: #单行注释
`:<<! 内容 !`: #多行注释
#其实和java等规范差不多,这里不详说了。
脚本执行检查
sh -n: #不执行script,仅查询语法问题
sh -v: #在执行脚本前,先将脚本的内容输出到屏幕上
sh -x: #将使用的脚本内容输出到屏幕
脚本执行方式:
sh == bash #不需要添加权限
./: #需要添加权限
/usr/local/test.sh: #也可以以路径的方式执行,同样需要权限:
read
- read 变量名
- read -p "提示信息" 变量名
- read -t n -p"提示信息" 变量名 #-t表示多少秒不输入就算超时
- read -n n 变量名 #表示读取n个输入字符
引用变量
"" : 表示弱引用,引用的值将是变量对应的值
test="hello shell"
echo "${test}"
结果是:hello shell
'': 表示强引用,引用的值值中间的字符串
test="hello shell"
echo '${test}'
结果是:${test}
变量运算
整数运算
1.使用expr
expr m + n #加
expr m - n #减
expr m / n #除
expr m \* n #乘
2.使用$((运算式))或者$[运算式]
echo $(($a + $b))
echo $[$a + $b]
3.使用let
let sum=2+3; echo $sum
let i++; echo $i
小数运算
echo "2/4" |bc #0
echo "2*4" |bc #8
echo "scale=2;6/4" #1.50 指定精确计算到小数点后两位()
awk 'BEGIN(print 1/2)' #0.5
echo "print 5.0/2 |python" #2
-
乘积小数点位数默认以乘数中小数点位数最多的为准(不指定scale参数)
-
除法中如果不指定scale参数,则结果没有小数位,小数位数完全按scale值来显示,计算结果的小数位数不足scale的值,则末尾补0
贪婪匹配和非贪婪匹配
一个%为非贪婪匹配,即匹配最短结果。%从右到左进行非贪婪匹配。匹配的内容为以%右边为分割符,分隔符右边的指定字符的最短字符串,然后删掉。
v=www.baidu.com
echo ${v%.*} #www.baidu
两个%%则为贪婪匹配
v=www.baidu.com
echo ${v%%.*} # www,匹配到的是以.为定界符的最长字符串
#则和%顺序相反,从左边开始匹配
v=www.baidu.com
echo ${v#*.} #baidu.com
echo ${v##*.} #com
字符串截取还可以用这样的方式:
${value: offset:length} #从offset开始截取指定长度
变量替换
使用/
url="www.baidu.com"
echo ${url/baidu/sougou} #www.sougou.com(只会替换一个,属于非贪婪匹配,也就是最短匹配)
echo ${url//w/W} #WWW.baidu.com(会匹配多个,属于贪婪匹配)
${value:-word}: #当value没有定义或者值为空返回Word的内容,否则返回变量值
${value:+word}: #当value已经赋值,才用Word进行替换,否则不进行替换
${value:=word}: #当value没有定义或者为空,返回Word的值,同时将Word的值赋值为value,否则返回变量的值