2 shell中的变量
2.1 变量介绍
在shell中,变量分为全局变量,局部变量,脚本变量三大类。其次,变量的类型只有字符串,只有在数字运算的时候解释器才会把数字解释成数字。
变量的定义:变量名=变量值
例如:
python@ubuntu:~/Desktop$ user=python # 当前终端定义变量user的值为python
2.2 本地变量
本地变量是什么
本地变量是:在当前系统的某个环境下才能生效的变量,作用范围小。
本地变量包含两种:普通变量和命令变量
2.2.1 普通变量
普通变量的定义方式有如下三种:
-
变量名=变量值
-
name1 = hello
-
重点:变量值必须是一个整体,中间没有特殊字符
-
变量名=‘变量值’
- name2 = ‘hello world’
- 多了定义有空格的字符串的功能
如果直接name2=hello world会报错
-
变量名=“变量值”
- name3 = “name is $name2”
- 多了解析字符串中的变量的功能
输出结果:name is hello world
如果是单引号:name3=‘name is $name2’
输出结果不会引用变量:name is name2
2.2.2 命令变量
用来把终端命令的输出结果保存到变量中
命令变量有两种定义方式
- `命令`
python@ubuntu:~/Desktop$ list = `ls`
输出list结果为ls在命令行查询后的结果
- $(命令)
python@ubuntu:~/Desktop$ list = $(ls)
注意: 命令变量必须是linux中的可执行命令
2.3 全局变量
全局变量:在当前系统的所有环境下都能生效的变量,如$PATH
环境是什么
环境是:每打开一个终端是一个shell环境,使用非source执行方式时,会开启子进程,也是一个shell环境,称为子shell环境。
查看全局变量
使用命令 env (# 只显示全局变量,主要是加载了~/.bashrc和/etc/profile文件)
python@ubuntu:~/Desktop$ env
XDG_VTNR=7
LC_PAPER=zh_CN.UTF-8
LC_ADDRESS=zh_CN.UTF-8
.....
2.3.1 定义全局(环境)变量
注意:自定义的全局变量只能在该终端和该终端启动的进程中使用
定义变量:变量名=值
- 方法一:
export 变量名 - 方法二:
export 变量名=值
全局变量演示:
python@ubuntu:~/Desktop$ env | grep user # 当前全局变量中没有user变量
python@ubuntu:~/Desktop$ export user=python3
python@ubuntu:~/Desktop$ env | grep user # 当前全局变量中有user变量
user=python3
打开新的终端执行env命令:
python@ubuntu:~/Desktop$ env | grep user # 当前全局变量中没有user变量
python@ubuntu:~/Desktop$
2.3.2 定义真正的全局变量(所有终端可用)
如果想要自己定义的全局变量在跟系统的全局变量一样在所有环境都有效,需要在~/.bashrc或/etc/profile文件中定义:
- 修改~/.bashrc后,直接打开新的终端,定义的全局变量就生效了,此方式只对当前用户有效
- 修改/etc/profile时,需要重启操作系统,定义的全局变量才生效,此方式对所有用户有效
- 上面两种方式在修改文件后,如果想让全局变量在当前终端生效,需要执行命令source ~/.bashrc或source /etc/profile
2.3.3 变量查看和取消
查看
- 方式一:$变量名
- 方式二:"$变量名"
- 方式三:${变量名}
- 用于变量与字符串拼接
python@ubuntu:~/Desktop$ str1 = "hello world"
python@ubuntu:~/Desktop$ echo ${str1}-bak
hello world-bak
- 方式四:"${变量名}"
取消变量
- unset 变量名
2.2.4 shell内置变量
内置变量是shell内部提供的一些经常用到的实用功能
如:
python@ubuntu:~/Desktop$ touch example.sh
- $0 获取当前执行的shell脚本名称
- 写入指令
#!/bin/bash
echo "This is a example"
echo "filename: $0"
-
- 输出结果
python@ubuntu:~/Desktop$ bash example.sh
This is a example
filename: example.sh
- $$ 获取执行的shell脚本的进程号
- 使用场景:用脚本启动进程的时候,需要关闭进程 这时候如果终端显示进程号就可以简单关闭该脚本
- 写入指令
echo "file_pid: $$"
- 输出结果
python@ubuntu:~/Desktop$ bash example.sh
This is a example
filename: example.sh
file_pid: 24013
- $n 根据参数的序号获取当前shell命令中参数
p.s.:如何向脚本中传入参数: - bash 脚本名.sh a b c d e
脚本名.sh后面的每个字符都代表一个参数,空格隔开 - $# 获取当前shell命令行中参数的个数
- 写入指令:
# 获取当前脚本传入的参数数量
echo "当前脚本传入的参数数量是: $#"
# 获取指定位置的参数
echo "第一个位置的参数是: $1"
echo "第二个位置的参数是: $2"
echo "第三个位置的参数是: $3"
echo "第四个位置的参数是: $4"
-
- 输出结果如下:
python@ubuntu:~/Desktop$ bash example.sh a b c d e
This is a example
filename: example.sh
file_pid: 24059
当前脚本传入的参数数量是: 5
第一个位置的参数是: a
第二个位置的参数是: b
第三个位置的参数是: c
第四个位置的参数是: d
python@ubuntu:~/Desktop$
- $? 获取上一个命令执行情况,0代表成功,其他数字表示失败)
- 使用场景:查看终端操作是否成功
- 注意:对于查看脚本文件的执行是否成功,$0查看的是脚本文件最后一行的执行情况,只要最后一行命令执行成功,不管前面有没有错,都返回0;只要最后一行命令执行失败,不管前面是不是全执行成功,都返回失败代码。
终端执行命令如下:
python@ubuntu:~/Desktop$ bash nihao # 不存在nihao文件
python@ubuntu:~/Desktop$ bash: nihao: No such file or directory
python@ubuntu:~/Desktop$ echo $?
127
python@ubuntu:~/Desktop$ ls
file1.sh num.sh test.sh weizhi.sh
python@ubuntu:~/Desktop$ echo $?
0
- 字符串精确截取
- 格式:${变量名: 起始位置:结束位置}
- 注意:从后面截取需要0-1
python@ubuntu:~/Desktop$ file="abcdefg"
# 从第1个字符开始,截取5个字符
python@ubuntu:~/Desktop$ echo ${file:0:5}
abcde
# 从第3个字符开始,截取5个字符
python@ubuntu:~/Desktop$ echo ${file:2:5}
cdefg
# 从倒数第5个字符开始,截取之后的5个字符
python@ubuntu:~/Desktop$ echo ${file:0-5:5}
cdefg
- 设置脚本文件变量的默认值
- 应用场景
使用脚本文件或者命令的时候,需要指定参数,而默认值设置后,可以省略输入参数 - 格式:${变量名:-默认值}
套餐示例:
- 应用场景
如果输入的参数为空,那么输出内容是 “您选择的套餐是: 套餐 1”
如果输入的参数为n,那么输出内容是 “您选择的套餐是: 套餐 n”
脚本内容如下:
#!/bin/bash
# 套餐选择演示
a="$1"
echo "您选择的套餐是: 套餐 ${a:-1}"