shell变量名的命名需要遵循如下规则:
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的保留关键字,(bash里的保留关键字如下)
| 命令 | 含义 |
| ! | 保留字,逻辑非 |
| : | 不做任何事,只做参数展开 |
| . | 读取文件并在shell中执行它 |
| alias | 设置命令或命令行别名 |
| bg | 将作业置于后台运行 |
| bind | 将关键字序列与readline函数或宏捆绑 |
| break | 保留字,跳出for、while、until、select循环 |
| builtin | 调用命令的内建命令格式,而禁用同名的函数。或者同名的扩展命令 |
| case | 保留字,多重选择 |
| cd | 切换当前工作目录 |
| command | 找出内建和外部命令;寻找内建命令而非同名函数 |
| continue | 保留字,到达下次for、while、until、select循环 |
| declare | 声明变量定义变量属性 |
| dirs | 显示当前存储的列表 |
| disown | 将作业从列表中移除 |
| do | 保留字,for、while、until、select循环的一部分 |
| done | 保留字,for、while、until、select循环的一部分 |
| echo | 打印参数 |
| elif | 保留字,if结构的一部分 |
| else | 保留字,if结构的一部分 |
| enable | 开启和关闭内建命令 |
| esac | 保留字,case的一部分 |
| eval | 将参数作为命令再次处理一遍 |
| exec | 以特定程序取代shell或为shell改变I/O |
| exit | 退出shell |
| export | 将变量声明为环境变量 |
| fc | 与历史命令一起运行 |
| fg | 将作业置于后台运行 |
| fi | 保留字,if循环的一部分 |
| for | 保留字,for循环的一部分 |
| function | 定义一个函数 |
| getops | 处理命令行选项 |
| hash | 记录并指定命令的路径名 |
| help | 显示内建命令的帮助信息 |
| history | 显示历史信息 |
| if | 保留字,if循环的一部分 |
| in | 保留字,case、for、select循环的一部分 |
| jobs | 显示后台运行的作业 |
| kill | 向进程传送信号 |
| let | 使变量执行算术运算 |
| local | 定义局部变量 |
| logout | 从Shell中注销 |
| popd | 从目录栈中弹出目录 |
| pushd | 将目录压入栈 |
| pwd | 显示当前工作目录 |
| read | 从标准输入中读取一行 |
| readonly | 将变量定义为只读 |
| return | 从函数或脚本返回 |
| select | 保留字,生成菜单 |
| set | 设置Shell选项 |
| shift | 变换命令行参数 |
| suspend | 终止Shell的执行 |
| test | 评估条件表达式 |
| then | 保留字,if结构的一部分 |
| time | 保留字,输出统计出来的命令执行时间,其输出格式由TIMEFORMAT变量来控制 |
| times | 针对Shell及其子Shell,显示用户和系统CPU的时间和 |
| trap | 设置扑捉程序 |
| type | 确定命令的源 |
| typeset | 声明变量,定义变量属性,与declare等价 |
| ulimit | 设置和显示进程占用的资源限制 |
| umask | 设置和显示文件权限码 |
| unalias | 取消别名定义 |
| unset | 取消变量或函数定义 |
| until | 保留字,一种循环结构 |
| wait | 等待后台作业完成 |
| while | 保留字,一种循环结构 |
定义变量
shell定义变量很简单,和大多数编程一样。不过需要注意的是,变量名不能加美元符号:”$“,在使用变量的时候才需要加美元符号。
name="hello world"
_name="lihua"
a_name="zhangsan"
name1="lisi"
使用变量
使用一个定义过的变量,只要在变量名前面加美元符号”$“即可。
name="hello world"
echo $name
echo ${name}
变量名外面的花括号是可选的,加不加都行,在某些情况下加花括号是为了帮助解释器识别变量的边界,比如下面这种情况,如果不给skill变量加花括号,写成echo "I am good at $skillScript",解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。
for skill in Ada Coffe Action Java; do
echo "I am good at ${skill}Script"
done
已经定义过的变量是可以被重新定义的。
name="张三"
echo $name
name="李华"
ehco $name
只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
myURL="https;//blog.amxsf.com"
readonly myURL
myURL="https;//www.baidu.com"
这个时候如果去运行这个脚本就会报错:NAME: This variable is read only.
删除变量
使用unset命令可以删除变量,变量删除后不可再次使用,且不能删除只读变量。
以下示例运行后将没有任何输出。
myUrl="https://www.runoob.com"
unset myUrl
echo $myUrl
变量类型
运行shell时,会同时存在三种变量:
- 局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- shell变量:shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

Comments NOTHING