Shell
什么是shell?
- shell是位于操作系统和应用程序之间,是他们二者最主要的接口,shell负责把应用程序的输入命令信息解释给操作系统,将操作系统指令处理后的结果解释给应用程序。
- 我们常说的shell是命令行式的shell,在工作中常用的是linux系统下的bash。
- shell 是 命令解释器
创建shell脚本
脚本创建工具
vi/vim
脚本命名
见名知意: 以.sh结尾
脚本命名
- 首行指定解析器 :#!/bin/bash
- 命令罗列和语法套用
注释内容
- 单行注释: 除了首行的#不是注释外,其他所有行内容,只要首个字符是#,那么就表示该行是注释
- 多行注释: :<<! … ! 和 :<<字符 … 字符
脚本执行
脚本执行完成之后,必须添加执行权限
chmod u+x xxx.sh (添加执行权限)
- bash xxx.sh 或 /bin/bash xxx.sh (推荐使用)
- xxx.sh 或 ./xxx.sh
- source xxx.sh 或 . xxx.sh (.号后面有空格)
- sh xxx.sh
总结:source或者.点号执行方式不会开启子进程,能共享当前终端定义的变量,其他执行方式会开启子进程
每打开一个终端是一个shell环境,使用非source执行方式时,会开启子进程,也是一个shell环境,称为子shell环境。
变量定义
1.普通变量
普通变量的定义有如下三种方式:
- 方式一 : 变量名=变量值 (=前后不能有空格 )
- 方式二: 变量名=‘变量值’ 不解析变量值的内容
- 方式三: 变量名=“变量值” 解析变量值中的内容
**习惯:**数字不加引号,其他默认加双引号
2.命令变量
命令变量有两种定义方式:
- 方式一: 变量名 =
命令
注意:`是反引号 - 方式二: 变量名=$(命令)
执行流程:
1、执行`或者$()范围内的命令
2、将命令执行后的结果,赋值给新的变量名A
变量方法
查看变量:
- 方式一: $变量名
- 方式二: “$变量名”
- 方式三: ${变量名}
- 方法四: 标准使用方式“${变量名}”
取消变量: unset 变量名
本地变量
普通变量只能在当前进程中使用 ,不能在子进程中使用,当前进程消失普通变量也就消失
如: temp=666 , name=“zhangsan” 变量前没有加其他修饰,就是本地变量
全局变量
全局变量是:在当前系统的所有环境下都能生效的变量
能够在当前进程和子进程中使用,如果另起一个终端则失效
,可以在外面定义,在里面shell脚本中使用
定义方式: export 变量名=值
查看所有全局变量: env
shell内置变量
符号 | 意义 |
---|---|
$0 | 获取当前执行的shell脚本文件名 |
$$ | 获取执行shell脚本的进程号 |
$n | 获取当前执行的shell脚本的第n个参数值,n=1…9,当n为0时表示脚本的文件名,如果n大于9就要用大括号括起来${10} |
$# | 获取当前shell命令行中参数的总个数 |
$? | 获取执行上一个指令的返回值(0为成功,非0为失败) |
案例
定义一个shell脚本: demo.sh
#!/bin/bash
echo 'lg'
echo $user
echo "脚本名称是: $0"
echo "脚本执行的进程号是: $$"
echo "传入的脚本参数个数是: $#"
echo "第一个参数是: $1"
echo "第二个参数是: $2"
echo "上一条指令是否返回成功(0为成功,非0失败): $?"
在命令行中:
export user=helloworld
bash demo.sh 20 21
执行结果:
lg
helloworld
脚本名称是: demo.sh
脚本执行的进程号是: 5548
传入的脚本参数个数是: 2
第一个参数是: 20
第二个参数是: 21
上一条指令是否返回成功(0为成功,非0失败): 0
字符串的精确截取
格式: ${变量名:起始位置:截取长度} 位置从0开始
${file:0:5} 从第1个字符开始,截取5个字符
${file:5:5} 从第6个字符开始,截取5个字符
${file:0-6:3} 从倒数第6个字符开始,截取之后的3个字符
默认值相关
场景一:
变量a如果有内容,那么就输出a的变量值
变量a如果没有内容,那么就输出默认的内容
格式: ${变量名:-默认值}
#!/bin/bash
# 如果输入参数为空,默认选择套餐1,否则套餐n
a="$1"
echo "您选择的套餐是: 套餐 ${a:-1}"
场景二:
如果变量没有定义,将默认值赋值给变量
格式: ${变量名:=默认值}
#!/bin/bash
a="$1"
echo "国家法定结婚年龄(男性)是 ${a:=22} 岁"
echo "国家法定结婚年龄(男性)是 ${a} 岁"
场景三:
当变量存在的时候输出提示信息
格式:
${变量名:+提示信息}
#!/bin/bash
a="$1"
echo "${a:+已经获取到第一位的参数}"
流程控制语句
函数
1.简单函数定义
#!/bin/bash
f1(){
echo "helloworld"
}
f1
2. 函数传参1
#!/bin/bash
f2(){
echo "hello $1"
}
f1 lg
3.函数传参2
#!/bin/bash
f3(){
echo "hello $1"
}
f1 ${2}
在命令行中
bash demo.sh hello world
执行结果:
hello world
4.函数传参3
#!/bin/bash
temp = "$1"
f3(){
echo "hello $1"
}
f1 "${temp}"