Shell 是什么
Shell 是指一种命令行解释器,是为用户和操作系统之间通信提供的一种接口
分类
- 图形界面shell(graphical user interface)
- 命令行shell (Command Line Interface ) 即CLI
Shell不只是解释器,还是一种脚本语言(解释型语言)
工作模式:
- 互动模式
- 脚步模式
互动模式:由系统管理人员直接通过键盘输入命令,并等待其执行在一个命令
脚步模式:设计出一个脚步文件,将所有需要执行命令写在该文件中,由bash shell读取并执行
Shell 内建命令
bash, :, ., [, alias, bg, bind, break, builtin, cd, command, compgen, complete, continue, declare, dirs, disown, echo, enable, eval, exec, exit,export, fc, fg,
getopts , hash, help, history, jobs, kill, let, local, logout, pops, printf, pushed, pwd, read,redonly, return, set, shift,shopt, source, suspend, test, times,
trap, rype, typeset, ulimit, smash,unalias,unset,wait
export 使变量能被子shell识别
//编写脚本export.sh内容
#!/bin/bash
echo $var
//执行脚本,结果变量为空
$ ./export.sh
// 赋值变量
$ var=100
$ echo $var
100
//查看变量是否变化
$ bash export.sh
//export 导出变量
$ export var=100
$ bash export.sh
100
echo $? 查看上次返回值
#!/bin/bash
function func_01 {
return 01
}
# 调用函数
func_01
# 查看之前函数的返回值
echo $?
查看bash版本信息
#系统中使用的shell
$ bash
bash-3.2
$ echo $SHELL
/bin/bash
bash-3.2
# 查看bash shell版本信息(1)
$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.
bash-3.2
# 查看bash shell版本信息(2)
$ echo $BASH_VERSION
3.2.57(1)-release
shell编程基础
- shell 变量
- shell 传递参数
- Shell 数组
- Shell 运算符
- shell echo 命令
- Shell printf命令
- shell test命令
- shell 流程控制
变量
- shell变量:弱类型(声明变量时不需要指定变量的类型)
- 类型
- 局部变量
- 环境变量(全局变量)(默认)
局部变量:指在某个shell中有效的变量,在其他shell中来说没有关系与作用,随着shell消息也跟着消失,作用范围限定在声明的某个shell中
环境变量:也称全局变量,shell脚本中默认是环境变量
若需子shell集成当前shell变量,可用export命令到导出为环境变量
注意:环境变量只能向下传递,不能向上传递(传子不传父)
$BASH — bash shell 全路径
$ echo $BASH
/bin/bash
$BASH_VERSION — bash shell 版本
$BASH_VERSION
3.2.57(1)-release
$CDPATH — 快速进入某个目录
$EUID — 记录当前用户UID;root 值为0
$ echo $EUID
501
$FUNCNAME — 在用户函数体内部,记录当前函数体的函数名
#!/bin/bash
function func_01 {
echo $FUNCNAME
}
# 调用函数
func_01
./export.sh
func_01
$HISTCMD — 记录下一条history命令中的编号
512 history
$ echo $HISTCMD
515
$HISTFILE — 记录history命令记录文件的位置
$HISTFILESIZE — 设HISTFILE文件记录命令的行数
$HISTSIZE — 缓冲区大小
$HOSTNSME — 展示主机名
$HOSTTYPE — 展示主机架构
$MACHTYPE — 主机类型GPU标示
$LANG — 设置当前系统语言环境
$PWD — 当前目录
$OLDPWD — 记录之前目录
$PATH — 代表命搜索的路径
$PS1 — 命令提示符
标识符代码 | 含义 |
W | 当前工作目录的basename |
w | 当前工作目录的全路径 |
d | 日期,格式:“周 月 日” |
H | 完整的主机名 |
h | 主机名 |
24小时制的时间,格式:HH:MM:SS | |
T | 12小时制的时间 |
u | 当前用户的用户名 |
$ | UID为0 显示“#”,否则显示“$” |
变量命名
规则:
- 必须以字母或下划线开头
- 长度没限制
- 不能喝shell的预设变量重名
- 不能使用shell的关键字
- 不能特殊字符开头
- 不能以数字开头
变量赋值与取值
# 定义:变量名=变量值
$name=john
# 注意:变量名与变量值之间用=等号相连不能有空格
$ name = john
-bash: name: command not found
#变量值包含空格的,可以用双引号 或单引号包含 ,否则报错
$ name=“jihan”
$ name='hi jihan'
$ name="hi jihan”
$ name=hi jihan
-bash: jihan: command not found
使用 ${ } 获取变量值 是一种保险的方式
bash-3.2$ name="hi jihan"
bash-3.2$ echo ${name}
hi jihan
bash-3.2$ echo name
name
shell具有弱变量特性,没有预先声明变量也可以引用
取消变量 — unset
bash-3.2$ name="hi jihan"
bash-3.2$ echo ${name}
hi jihan
# 取消变量/函数
bash-3.2$ unset name
bash-3.2$ echo ${name}
特殊变量
- 位置参数
- 脚本或命令返回值 ¥?— 上一个命令的返回值
数组
shell中的数组对元素个数没有限制,担支持一维数组
定义: declare 定义数组array,下标从0开始
bash-3.2$ declare -a Array
bash-3.2$ Array[0]=0
bash-3.2$ Array[1]=1
bash-3.2$ Array[2]="hi jihan"
bash-3.2$ echo $Array
0
bash-3.2$ echo $Array[0]
0[0]
# 获取数组元素必须使用 ${ } 方式
bash-3.2$ echo ${Array[0]}
0
- 一次性获取所有元素的值
-
- echo ${Array[@]}
- echo ${Array[@]}
bash-3.2$ echo ${Array[@]}
0 1 hi jihan
-
- echo ${Array[*]}
bash-3.2$ echo ${Array[*]}
0 1 hi jihan
- 获取数组长度 — 使用”#“
bash-3.2$ echo ${#Array[*]}
3
- 数组截取
bash-3.2$ echo ${Array[*]:1:2}
1 hi jihan
- 连接数组
bash-3.2$ Name[0]='hi name’
#使用()括号括起来,赋值给一个新变量,实现连接数组合并
bash-3.2$ Con=(${Array[*]} ${Name[*]})
# 默认取出第一个
bash-3.2$ echo ${Con}
0
#取出全部
bash-3.2$ echo ${Con[*]}
0 1 hi jihan hi name
#注意: 两个数组存在元素值相同时,并没有去重处理
bash-3.2$ Name[1]=1
bash-3.2$ Con=(${Array[*]} ${Name[*]})
bash-3.2$ echo ${Con[*]}
0 1 hi jihan hi name 1
- 替换元素
#只需要将需求修改元素值,以 “取出全部数组” + “/” + 旧元素值 + “/” + 新元素值 ,然后用()括起来赋值回当前数组变量就可以
bash-3.2$ Array=(${Array[*]/hi jihan/hijian})
bash-3.2$ echo ${Array[*]}
0 1 hijian
- 取消数组或元素
bash-3.2$ echo ${Name[*]}
hi name 1
bash-3.2$ unset Name[1]
bash-3.2$ echo ${Name[*]}
hi name