shell语法
自动化运维 项目部署
1、什么是shell
Shell就是一个命令解释器,实际就是一个程序,/bin/bash,还有自己的语法
2、注释
单行注释 : #
多行注释 : :<<字符 ... 字符
3、执行方式
bash /path/to/script-name 或 /bin/bash /path/to/script-name (强烈推荐使用)
/path/to/script-name 或 ./script-name (当前路径下执行脚本)
source script-name 或 . script-name (注意“.“点号后面有空格)
source执行脚本时,不会开启开启新的进程,能与当前终端共享环境,前两种方式都会开启新的进程执行脚本(重点)
4、变量
普通变量
数字:age=123
其他:name="wang" 如果双引号里面有变量,会解析
命令变量
1、变量名=`命令`
2、变量名=$(命令)
把命令执行的结果交给变量
5、全局变量
定义全局变量
方法一:
变量名=值
export 变量
方法二:(最常用)
export 变量名=值
如果直接在终端定义,只能在当前终端以及子进程中使用
如果想要自己定义的全局变量在跟系统的全局变量一样在所有环境都有效,需要在~/.bashrc或/etc/profile文件中定义:
修改~/.bashrc后,直接打开新的终端,定义的全局变量就生效了,此方式只对当前用户有效
修改/etc/profile时,需要重启操作系统,定义的全局变量才生效,此方式对所有用户有效
上面两种方式在修改文件后,如果想让全局变量在当前终端生效,需要执行命令source ~/.bashrc或source /etc/profile
6、内置变量(重点)
$0 获取当前执行的shell脚本文件名
$$ 获取执行shell脚本的进程号
$n 获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9就要用大括号括起来${10}
$# 获取当前shell命令行中参数的总个数
$? 获取执行上一个指令的返回值(0为成功,非0为失败),如果是执行脚本,返回的是脚本中最后一条命令的结果
7、默认值
默认值相关
场景一:
变量a如果有内容,那么就输出a的变量值
变量a如果没有内容,那么就输出默认的内容
格式:
${变量名:-默认值}
场景二:
无论变量a是否有内容,都输出默认值
格式:
${变量名+默认值}
8、表达式(重点)
测试语句
[ 1 = 1 ] :括号左右必须有空格,符号左右必须有空格
echo $? 获取结果,0是成功,非0失败
条件表达式
&&符号
命令1 && 命令2
如果命令1执行成功,那么执行命令2
如果命令1执行失败,那么不执行命令2
||符号
命令1 || 命令2
1 如果命令1执行成功,那么不执行命令2
2 如果命令1执行失败,那么执行命令2
文件表达式
-f 判断输入内容是否是一个文件
[ -f neizhi.sh ]
-d 判断输入内容是否是一个目录
-x 判断输入内容是否可执行
计算表达式
$(( 计算表达式 ))
let 计算表达式
$((a+1))
let a=$a+1
9、重定向
命令>文件
把命令返回的结果输出到文件
命名返回的结果有两种,1代表正确的结果,2代表错误的结果
命令>文件 2>&1 &:当成引用,把错误的结果输出到正确结果同样的位置
把命令执行返回的所有结果输出到文件中
10、linux四剑客
grep:查找文件内容
grep -nr key .
find:查找文件
find . -name "*py"
sed:行编辑工具
s:替换
a:行后追加
i:行前插入
d:删除
sed -i '3s#SED#sed#2' set.txt
把第3行的第2个SED改为sed
sed -i 's#SED#sed#g' set.txt
把每一行的第所有SED改为sed
sed -i '1,3a\hello2' set.txt
在1到3行后都追加一行
sed -i '1i\hello2' set.txt
在1行前插入一行
sed -i '2d' set.txt
删除第2行