shell中的变量
变量介绍
变量即变化的量,核心是"变"与"量",变即变化,领即衡量状态。
量:是记录现实世界当中的某种状态
变:指的是记录状态是可以发生变化的
如何使用变量
变量名 赋值符号 变量值
name=zh // shell中定义的变量
name: zh // yaml中定义的变量
# 变量的语法
1.变量名: 相当于一个门牌号,便于取出变量值,是访问到值的唯一方式
2.赋值符号:将值的内存地址绑定给变量名
3.变量值: 用来表示状态
变量的使用规则:先定义,再通过变量名去引用
定义变量名的规范
# 前提:变量名的命名应该能反映出值记录的状态。 变量是用来访问变量的值,所有变量应该遵循一定的规范,来方便我们标识存到内存中值的功能。
变量名的命名规则:
1.变量名只能是字母、数字或下划线的任意组合 (区分大小写)
2.变量不可以使用中文
3.变量名不要使用命令来命名
4.变量不能以数字开头
5.不要使用拼音
# 变量名定义的方式
1.下划线+纯小写
name_of='xxx'
2.驼峰体
nameOf='xxx'
ageOf='xxx'
3.下划线+纯大写
NAME_OF='xxx'
不好的方式
1.变量名为中文、拼音
2.变量名过长
3.变量名词不达意
变量的分类
系统内置环境变量
# 查看系统环境变量
env
declare
export
# 环境变量
LANG # 字符集语言
PATH # 该变量中的路径里的所有可执行文件,都可以执行.不需要加路径
PS1 # 命令提示符
UID # 当前登录的uid
HOST TNAME # 当前主机名
PWD # 当前工作路径
# 历史记录相关
HISTSIZE # 保存历史记录条数
HISTFILESIZE # 将历史命令保存到隐藏文件中记录的条数
HISTFILE # 历史命令保存到隐藏文件的路径
TMOUT # 终端一段时间不操作后断开连接的时间
HISTCONTROL: export HISTCONTROL=ignorespace # 在命令行加空格就会不在历史命令里记录这条命令
PROMPT_COMMAND # 每次执行命令都会把命令打印出来
# 如果有多个变量在一起注意使用大括号分隔变量
mkdir ${hsk}_${jdlw}_${mdlw}
位置变量
| 符号 |
含义 |
应用 |
| $N |
脚本的第N个参数 |
命令传参,传递给脚本,在脚本中使用 |
| $0 |
脚本名字 |
脚本使用方法:给出错误体质或者使用帮助 |
| $# |
统计脚本参数 |
判断脚本是否传参 |
| $* |
获取脚本所有参数 |
将所有参宿当成一个整体,对传递的参数进行判断 |
| $@ |
获取脚本所有参宿 |
将每一个参数当成是一个整体,对传递的参数进行判断 |
特殊变量(状态)
$? # 表示上一个命令执行的状态
特殊命令: false diff
$$ # 表示当前脚本执行的pid
$! # 上一个脚本或程序运行的pid
$_ # 获取上一条命令的最后一个参数(以空格为分隔符) esc+.
变量的子串
${变量名} # 调用变量
${#变量名} # 获取该变量的值长度
${变量名:偏移量} # 字符串的截取
${变量名:偏移量:不创} # 字符串的截取
${变量名#字符串} # 从变量开头,删除最短匹配word的子串
${变量名##字符串} # 从变量开头,删除最长匹配word的子串
${变量名%字符串} # 从变量结尾,删除最短匹配word的子串
${变量名%%字符串} # 从变量结尾,删除最长匹配word的子串
${变量/匹配内容/替换内容} # 使用string替换第一个匹配内容
${变量名//匹配内容/替换内容} # 视图string替换所有匹配内容
扩展变量
# 给变量默认值
${变量名:-字符串} # 如果变量名没有被赋值,就以字符串为默认值,它不会赋值给变量
${变量名:=字符串} # 如果变量名没有被赋值,就以字符串为默认值,他会赋值给变量(用户没有传递值)
${变量名:?字符串} # 如果变量没有被赋值或其值为空,就以?号后面的字符串为报错信息输出
${变量名:+字符串} # 如果变量没有被赋值或其值为空,就什么都不做,否则就替换变量内容
变量的赋值方式
直接赋值 name=zh
间接赋值 ip=`ifconfig eth0|awk 'NR==2'{print $2}`
交互赋值 read -p '请输入内容' 变量名
传参赋值 $1 $2 $3
交互赋值
read
read 选项 变量名
-p # 打印一行内容
-s # 不显示输入内容
-t # 设置超时时间
-a # 将后面所有结果放入数组
shell中的数据类型
# 字符串类型
赋值: name='字符串'
取值
$name
# 整型
age=18
# 数组类型
赋值
list=(python java golang shell)
list[0]='aaa'
list[1]='bbb'
list[2]='ccc'
list[3]='ddd'
取值
${list(0)}
${list(1)}
${list(2)}
${list(3)}
循环数组
list=(python java golang shell)
for yuansu in ${list[*]};do
echo $yuansu
done
echo ${#list[*]} # 数组中元素的个数