shell脚本-基础篇

1,403 阅读3分钟

shell的功能

  1. 自动补全
yum -y install bash-completion
  1. 查看历史命令
history #查看所有历史命令
history -n #查看最近的n条命令
history -d n #删除第n条命令记录
!n #执行第n条命令
!-n #执行底数第n条命令
  1. 别名功能
alias h20 = 'head -20' #创建别名,以后就可以用h20 代替后者
unalias h20 #取消别名
#让别名永久生效
vim ~/.bashrc
alias h ='cd /' #添加别名
#然后退出
source ~/.bashrc #刷新文件

image-20210831164719583

bash初始化

环境变量的加载

  1. /etc/profile:

  2. /etc/bashrc:

  3. ~/.profile:

  4. ~/.bash_login

  5. ~/.bash_profile

  6. ~/.bashrc

  7. ~/.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,否则返回变量的值