Shell脚本--变量
1. 定义变量
Shell 支持一下三种定义变量的方式:
variable=value variable='value' variable="value"
variable 是变量名,value 是赋给变量的值。如果 value 不包含任何空白符,那么可以不用引号;否则就必须使用引号。注意,赋值号=的周围不能有空格。
Shell 变量的命名规范和大部分编程语言都一样:
- 变量名由数字、字母、下划线组成;
- 必须以字母或者下划线开头;
- 不能使用 Shell 里的关键字(通过 help 命令可以查看保留关键字)。
2. 使用变量
使用一个定义过的变量,只要在变量名前面加符号 $ 即可,如:
#!/bin/bash val=hello echo $val echo ${val}
其结果为:
hello
hello
变量名外面的花括号 {} 是可选的,加不加都可以。但是,建议加上,会给你避免不少麻烦。
3. '' 和 ""的区别
定义变量时,变量的值可以由单引号 '' 包围,也可以由双引号 "" 包围,它们到底有什么区别呢?下面以示例来说明:
#!/bin/bash val=world str1='hello ${val}' str2="hello ${val}" echo ${str1} echo ${str2} str3='ls: $(ls)' str4="ls: $(ls)" echo ${str3} echo ${str4}
其结果为:
hello ${val} hello world ls: $(ls) ls: cfind.sh cstring.sh cwhile.sh
以单引号 '' 包围时,不会解析内部的变量和命令等,里面是什么就直接原样赋值给变量。
以双引号 "" 包围时,会先解析内部的变量和命令等,然后再将解析后的内容赋值给变量。
4. `` 和 $()
Shell 支持将命令的执行结果赋值给变量,常见的有以下两种方式:
variable=`command`
variable=$(command)
第一种方式把命令用反引号 ``(位于 Esc 键的下方)包围起来,反引号和单引号非常相似,容易产生混淆,所以不推荐使用这种方式;
第二种方式把命令用 $() 包围起来,区分更加明显,所以推荐使用这种方式。
而且, $() 支持嵌套使用,反引号 `` 则不支持。但是,$() 仅在 Bash Shell 中有效,而反引号可在多种 Shell 中使用。
需要注意的是:如果命令的输出内容有多行或者有多个连续的空白符时,那么在输出变量时应该将变量用双引号包围;否则,会导致与预期效果不一致。
示例:
#!/bin/bash value=$(ls -l) echo ${value} echo -------------------------- echo "${value}"
其结果为:
total 12 -rw-r--r--. 1 root root 1087 Mar 4 18:18 cfind.sh -rw-r--r--. 1 root root 90 Apr 15 15:18 cstring.sh -rw-r--r--. 1 root root 228 Mar 5 10:56 cwhile.sh -------------------------- total 12 -rw-r--r--. 1 root root 1087 Mar 4 18:18 cfind.sh -rw-r--r--. 1 root root 90 Apr 15 15:18 cstring.sh -rw-r--r--. 1 root root 228 Mar 5 10:56 cwhile.sh
所以,为了防止出现格式混乱的情况,建议在输出变量时加上双引号。
5. 只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
例如:
#!/bin/bash readonly val=hello val=world
其结果为:
cstring.sh: line 4: val: readonly variable
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通