变量
最后更新于:2022-04-02 03:53:09
[TOC]
## 变量
### 创建变量
```
a=z # 变量 a 赋值为字符串 z
b="a string" # 包含空格,就必须放在引号里面
c="a string and $b" # 变量值可以引用其他变量的值
d="\t\ta string\n" # 变量值可以使用转义字符
e=$(ls -l foo.txt) # 变量值可以是命令的执行结果
e=`ls -l foo.tx` # 变量值可以是命令的执行结果(使用反引号)
f=$((5 * 7)) # 变量值可以是数学运算的结果
```
### 读取变量
如果变量不存在,Bash **不会报错**,而会输出空字符
2. 如果变量的值本身也是变量,可以使用`${!parameter}`的语法
```
${!parameter}
```
3. 设置默认值
```
${a:=b}
```
4. 切断
```
${parameter:offset}
从第offset之后开始 a="123456" ,echo ${a:2},3456
${parameter:offset:length}
length 设置长度为6
```
5. 变量长度
```
${#parameter}
```
6. 打印数组
```
${!name[@]} |${!name[*]}
打印索引
${name[@]} | ${!name[*]}
打印元素
```
7.过滤前缀
```
${parameter#word}
${parameter##word}
```
不打印匹配的world
#### ${param:?}读取变量为空报错
```
rm -rf ${a:?错误提示语句(a不存在)}/
```
默认 `${a}`为空不报错,某些场景下非常不安全,使用 `${a:?}`如果变量不存在就会报错.
### 删除变量
```
// 方式一:unset 也是把值变为 空字符
unset NAME
//方式二(推荐):
$ foo=''
$ foo=
```
### export 导出变量
子 Shell 默认读取不到父 Shell 定义的变量,可使用 export
```
NAME=foo
export NAME
//or
export NAME=foo
```
## 特殊变量
### $? 上个命令的退出状态
`$?`为上一个命令的退出码,用来判断上一个命令是否执行成功。返回值是`0`,表示上一个命令执行成功;如果是非零,上一个命令执行失败
### $$ 当前Shell进程ID
`$$`为当前 Shell 的进程 ID
```
$ echo $$
10662
```
这个特殊变量可以用来命名临时文件。
```
LOGFILE=/tmp/output_log.$$
```
### $n n为1,2,3...
传递给脚本或函数的参数
### $# 参数个数
### $_ 上一个命令的最后一个参数
```
$ grep dictionary /usr/share/dict/words
dictionary
$ echo $_
/usr/share/dict/words
```
### $! 最近一个后台执行的异步命令的进程 ID
```
$ firefox &
[1] 11064
$ echo $!
11064
```
### $0 当前脚本的文件名
```
$ echo $0
bash
```
### $* 和 $@ 所有参数
## declare 命令
```
declare OPTION VARIABLE=value
OPTION
-a:声明数组变量。
-f:输出所有函数定义。
-F:输出所有函数名。
-i:声明整数变量,可直接运算 result=val1*val2。
-l:声明变量为小写字母。
-p:查看变量信息。
-r:声明只读变量。
-u:声明变量为大写字母。
-x:该变量输出为环境变量
```
如
```
declare -i ab=123
echo ${ab} // 123
ab="abc"
echo ${ab} // 由于只能为整型,赋值字符串变为0
```
## readonly 命令 同 `declare -r`
## let 命令
```
$ let foo=1+2
$ echo $foo
3
$ let "v1 = 1" "v2 = v1++"
$ echo $v1,$v2
2,1
```
';