Shell中的变量
📅 2026/7/29 2:15:26
👁️ 阅读次数
📝 编程学习
1、变量命名
- 可以使用数字,字母,和下划线给变量命名
- 不能用数字开头
- 如果给同一个变量赋值多次,最后一次赋值会覆盖之前的值
var1=value#普通赋值方法var2='value'var3="hello world"#当变量的值(字符串)中包含任何空白符时,加双引号var4="$(ls-l)"#将命令结果赋值给变量注意:=前后不要有空格(区别于其他语言,Shell对空格检查严格)
2、变量的使用
使用一个定义过的变量,只要在变量名前面加美元符号$即可,如:
str="Hello"echo$strecho${str}当需要标明变量的边界时,需要加上花括号。
skill="Java"echo"I am good at${skill}Script如上,如果不加花括号会被认为是$skillScript,导致出现问题
3、变量作用域
- 局部变量
局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。 - 环境变量
所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。 - shell变量
shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
4、内置变量
shell内置的环境变量是所有的shell程序都可以使用的变量,环境变量会影响所有的脚本的执行结果。
| 变量 | 说明 |
|---|---|
PATH | 命令的搜索路径,以冒号作为分隔符 |
HOME | 用户的家目录的路径,是cd命令的默认参数 |
COLUMNS | 命令行编辑模式下可使用命令的长度 |
HISTFILE | 命令历史的文件路径 |
HISTFILESIZE | 命令历史中包含的最大行数 |
HISTSIZE | history命令输出的记录数 |
LOGNAME | 当前用户的名字 |
SHELL | 当前使用的shell |
PWD | 当前的工作目录 |
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过$𝑛的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数等。注意,若参数数量超过10,需要使用${10}的形式获取。
| 参数 | 解释 |
|---|---|
$# | 命令行的参数的个数 |
$0 | 当前脚本的名称,$2表示脚本的第二个参数…… |
$* | 以“参数1 参数2 参数3”的形式返回所有参数的值 |
$@ | 以“参数1”“参数2”“参数3”的形式返回所有参数的值 |
$$ | 返回本程序的进程ID(PID) |
$? | 返回本程序的结束状态码 |
5、取消变量
unsetxxx#将之前定义的变量xxx删除,后面将不在有效。如果直接关闭终端进程,也可以达到取消变量的效果。
6、变量扩展语法
| 形式 | 说明 |
|---|---|
${var} | 变量本来的值 |
${var:-word} | 如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值。 |
${var:=word} | 如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word。 |
${var:?message} | 如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。如果在Shell脚本中发生了这个替换,那么脚本将停止运行。 |
${var:+word} | 如果变量 var 被定义,那么返回 word,但不改变 var 的值。 |
7、字符串操作
计算长度
string="abcd"echo${#string}#输出 4提取子串
string="alibaba is a great company"echo${string:1:4}#输出liba拼接字符串
your_name="qinjx"greeting="hello, "$your_name" !"greeting_1="hello,${your_name}!"echo$greeting$greeting_1查找字符串
string="alibaba is a great company"echo`exprindex"$string"is`text="read phy addr: 0x1f reg: 0x1f value : 0x0"str="value : "value=${text#*$str}#打印value的值echo"$value"0x0替换字符
string="123123"echo${string/3/0}#用0替换第一个遇见的3echo${string//3/0}#用0替换串中所有3
编程学习
技术分享
实战经验