定义
Shell 也是一种程序设计语言,它有变量,关键字,各种控制语句,有自己的语法结构,利用shell程序设计语 可以编写功能很强、代码简短的程序
#! Shebang 定义解释器
分类
[root@newrain ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin默认shell: bash shell
centos中脚本使用的默认shell 为/usr/bin/sh
查看当前正在使用的shell
echo $SHELL
shell 的切换
vim /etc/passwd 编辑登录shell
shell的脚本规范
[root@newrain ~]# vim helloworld.sh ---.sh代表这个文件是个shell脚本,第一个原因,让别人认的这个是shell脚本,sh后缀有高亮显示。
拓展名后缀,如果省略.sh则不易判断该文件是否为shell脚本
1. #!/usr/bin/env bash ---shebang蛇棒, 解释器, 翻译 2. #
3. #
3. # Author: newrain
4. # Email: newrain@163.com ---这就是注释, 你没看错
5. # Github: https://github.com/newrain001
6. # Date: 2019/**/**
7. printf "hello world\n"功能说明:打印hello world
[root@newrain ~]# sh helloworld.sh
hello world
[root@newrain ~]# chmod +x helloworld.sh
[root@newrain ~]# ./helloworld.sh
[root@newrain tmp]# /tmp/helloworld.sh
hello world# 执行脚本方式
1、 sh 脚本.sh
2、 bash 脚本.sh
3、 ./脚本.sh # 需要执行权限
4、 . 脚本.sh
5、 source 脚本.sh
第一行: “#!/usr/bin/env bash”叫做shebang, shell语法规定shell脚本文件第一行为整个文件的解释器
第二行: 为“#”开头的行为注释行默认不会被程序所读取, 用来说明文件及标定所属人员使用, 也可用来解释程序 第七行: 为格式化打印语句printf, printf可以把后面的“hello world”打印到指定的终端中, \n 为换行符
变量的类型
变量
bash作为程序设计语言和其它高级语言一样也提供使用和定义变量的功能
预定义变量、环境变量、自定义变量、位置变量
预定义变量
$? 最后一次执行的命令的返回状态。如果这个变量的值为 0,则证明上一条命令正确执行;如果这个变量的值为非 0 ,则 证明上一条命令执行错误
$$ 当前进程的进程号(PID)$! 后台运行的最后一个进程的进程号(PID)
变量置换
命令替换
a=`date +%m%d` a=$(date +%m%d) 反引号亦可用$() 代替
变量替换
一 ${parameter:-word} 若 parameter 为空或未设置,则用 word 代替 parameter 进行替换,parameter 的值不变 # a=1 # unset b # a=${b:-3} # echo $a 3 # echo $b # 若 parameter 不为空,则不替换,parameter 的值不变 # unset b # # a=1 # b=2 # a=${b:-3} # echo $a 2 # echo $b 2 # 二 ${parameter:=word} 若 parameter 为空或未设置,则用 word 代替 parameter 进行替换,parameter 的值改变 # a=1 # unset b # a=${b:=3} # echo $a 3 # echo $b 3 # 若 parameter设置了,则 不替换,parameter 的值不变 # a=1 # b=2 # a=${b:=3} # echo $a 2 # echo $b 2 # 三 ${parameter:+word} 若 parameter 设置了,则用 word 代替 parameter 进行替换,parameter 的值不变 # a=1 # unset b # a=${b:+3} # echo $a # echo $b # a=1 # b=2 # a=${b:+3} # echo $a 3 # echo $b 2 # 四 ${parameter:?message} 若 parameter 为空或未设置,则 message 作为标准错误打印出来,这可用来检查变量是否正确设置 # unset a # ${a:?unset a} -bash: a: unset a
变量替换-匹配截取
${变量#关键词} 若变量内容从头开始的数据符合『关键词』,则将符合的最短数据切除 ${变量##关键词} 若变量内容从头开始的数据符合『关键词』,则将符合的最长数据切除 ${变量%关键词} 若变量内容从尾向前的数据符合『关键词』,则将符合的最短数据切除 ${变量%%关键词} 若变量内容从尾向前的数据符合『关键词』,则将符合的最长数据切除 ${变量/旧字符串/新字符串} 若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串替代』 ${变量//旧字符串/新字符串} 若变量内容符合『旧字符串』则『全部的旧字符串会被新字符串替代』 索引及切片 [root@newrain ~]# a=12345678 [root@newrain ~]# echo ${a:5} //从第5位开始截取 678 [root@newrain ~]# echo ${a:3:4} 4567 [root@newrain ~]# echo ${a:2:-1} 34567 [root@newrain ~]# echo ${a:2:-2} 3456 [root@newrain ~]# url=www.sina.com.cn [root@newrain ~]# echo ${#url} //获取变量的长度 15 [root@newrain ~]# echo ${url} //正常显示变量 www.sina.com.cn 变量内容的删除 [root@newrain ~]# echo ${url#*.} 从前往后,最短匹配 sina.com.cn [root@newrain ~]# echo ${url##*.} 从前往后,最长匹配 cn [root@newrain ~]# echo ${url%.*} 从后往前,最短匹配 www.sina.com [root@newrain ~]# echo ${url%%.*} 从后往前,最长匹配 www [root@newrain ~]# echo ${url#a.} www.sina.com.cn [root@newrain ~]# echo ${url#*a.} com.cn 变量内容的替换 $ a=123456123789 $ echo ${a/1/} 第一次匹配的被替换 23456123789 $ echo ${a//1/} 全局的匹配被替换 2345623789 $ echo ${a/1/x} x23456123789 $ echo ${a//1/x} x23456x23789 例: file=/dir1/dir2/dir3/my.file.txt ${file#*/}: 拿掉第一条 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt ${file##*/}: 拿掉最后一条 / 及其左边的字符串:my.file.txt ${file#*.}: 拿掉第一个 . 及其左边的字符串:file.txt ${file##*.}: 拿掉最后一个 . 及其左边的字符串:txt ${file%/*}: 拿掉最后条 / 及其右边的字符串:/dir1/dir2/dir3 ${file%%/*}: 拿掉第一条 / 及其右边的字符串:(空值) ${file%.*}: 拿掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file ${file%%.*}: 拿掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my 记忆的方法为: # 是去掉左边(在键盘上 # 在 $ 之左边) % 是去掉右边(在键盘上 % 在 $ 之右边) 单一符号是最小匹配;两个符号是最大匹配(贪婪匹配)。 $ a=123 $ echo ${#a} 表示$var的长度 3
basename & dirname
basename 命令 basename 是去除目录后剩下的名字 # 不会检测文件系统,只是取路径的最后一段,将他截取出来 例: #temp=/home/temp/1.test #base=`basename $temp` #echo $base 结果为:1.test dirname 是去除文件的目录名 # 不会检测文件系统,默认路径的最后一段为文件名,把它扇区 例: #temp=/home/temp/1.test #dir=`dirname $temp` #echo $dir 结果为:/home/temp dirname 获取当前脚本的路径 $( cd $( dirname $0 ) ; pwd )