Shell之变量
Shell之变量
😄 Written by Zak Zhu
学习python风格, 优雅规范书写shell代码
参考
- 鸟哥私房菜
- 菜鸟教程(http://www.runoob.com/linux/linux-shell-variable.html)
- RHCE培训
- Joke Shi/Linux shell之数组(https://www.cnblogs.com/Joke-Shi/p/5705856.html)
- 9.4.2 向数组追加元素(http://book.2cto.com/201209/3572.html)
- Shell数组: Shell数组定义以及获取数组元素(http://c.biancheng.net/view/810.html)
变量命名规则
- 命名只能使用英文, 数字和下划线, 首个字符不能以数字开头
- 中间不能有空格
- 不能使用标点符号
- 不能使用Bash里的关键字(可用help命令查看保留关键字)
变量语法规范
-
var=VALUE
# shell中变量赋值等号两边没有空格 -
${VARIABLE}
# 调用变量的值 -
$(COMMAND)
# 调用用命令执行的结果 -
var="string"
# str数据类型建议使用双引号括起来$ , ` , \ , ! , 除此之外, 双引号可以去掉所有字符的特殊含义
四种变量类型
- Local Variable
- Env Variable
- Global Env Variable
- User Env Variable
系统变量
env # 查看环境变量
set # 查看所有变量
系统变量 | 注释 |
---|---|
HOSTNAME | HOSTNAME="mac" |
PS1 | [[\e[31;49m]\u[\e[0m]@[\e[36;49m]\H[\e[0m] [\e[33;49m]\w[\e[0m] \t]\n$ |
HISTSIZE | default 1000 |
MAIL="/var/spool/mail/root" | |
PATH | PATH="/usr/share/Modules/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/home/root/bin" |
LANG | LANG="en_US.UTF-8" |
RANDOM | a random number (0~32767) |
HOSTTYPE | HOSTTYPE="x86_64" |
MACHTYPE | MACHTYPE="x86_64-redhat-linux-gnu" |
特殊变量
变量 | 注释 |
---|---|
$0 | 返回当前脚本的文件名 |
$n | 返回传递给脚本的参数. n是一个数字, 表示第几个参数 |
$# | 返回传递给脚本或函数的参数个数 |
$* | 返回传递给脚本的所有参数, 数据类型: 字符串 |
$@ | 返回传递给脚本的所有参数, 数据类型: 数组 |
$? | 返回脚本或命令运行的退出状态 |
$$ | 返回脚本运行的当前进程号 |
变量的使用
UNSET
在当前shell中取消某变量
e.g. unset name
EXPORT
子程序会继承父程序的环境变量, 子程序不会继承父程序的自定义变量
export: 自定义变量转成环境变量
e.g. export name="Zak"
READ
相当于python中input()
e.g. read -p "please input your name: " myname
DECLARE
宣告变量的数据类型
变量的数据类型默认为字符串
Using +
instead of -
turns off the given attribute.
declare [-aixr] VARIABLE
Options:
-a # array
-i # integer
-x # to make VARIABLE export ("+x": to cancle )
-r # to make VARIABLE readonly
-p # display the attributes and the value of each VARIABLE
ARRAY
下面仅简单介绍BASH中数组的基础用法, 复杂的使用可以阅读本文参考中的文章, 不过我会选择用更为灵活的python来写_
如何定义数组
-
方法一
array_name=(value1 value2 value3 ...)
-
方法二
array_name[0]=value1 array_name[1]=value2 array_name[2]=value3 ...
读取数组元素
-
读取一个元素
echo ${array_name[index]}
-
读取所有元素
echo ${array_name[*]} 或者 echo ${array_name[@]}
获取数组长度
获取数组长度的方法与获取字符串长度的方法相同
echo ${#array_name[*]}
或者
echo ${#array_name[@]}
变量内容的删除和替换
用法 | 说明 |
---|---|
${变量#关键词} |
若变量内容从头开始的数据符合关键词, 则将符合的最短数据删除 |
${变量##关键词} |
若变量内容从头开始的数据符合关键词, 则将符合的最长数据删除 |
${变量%关键词} |
若变量内容从尾向前的数据符合关键词, 则将符合的最短数据删除 |
${变量%%关键词} |
若变量内容从尾向前的数据符合关键词, 则将符合的最长数据删除 |
${变量/旧字符串/新字符串} |
若变量内容符合旧字符串, 则第一个旧字符串会被新字符串替换 |
${变量//旧字符串/新字符串} |
若变量内容符合旧字符串, 则全部的旧字符串会被新字符串替换 |