变量用于存储和管理运行在内存中的数据。
变量的类型:系统环境变量、自定义变量、特殊符号变量。
2.1系统环境变量
系统环境变量是系统提供的共享变量,是linux系统加载shell的配置文件中定义的变量共享给所有的shell程序使用。
shell 的配置文件分类:全局配置文件、个人配置文件
全局配置文件
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
个人配置文件
当前用户/.bash_profile
当前用户/.bashrc
环境变量分类:系统级环境变量、用户级环境变量
系统级环境变量:shell环境加载全局配置文件中的变量共享给所有用户、所有shell进程使用,全局共享;
用户级环境变量:shell环境加载个人配置文件中的变量共享当前用户的shell程序使用,登录用户使用。
查看当前shell系统环境变量
env
效果如下:
root@mciserver:~# env
SHELL=/bin/bash
PWD=/root
LOGNAME=root
XDG_SESSION_TYPE=tty
HOME=/root
LANG=en_US.UTF-8
SSH_CONNECTION=192.168.231.227 56294 11.10.179.43 62485
XDG_SESSION_CLASS=user
TERM=xterm
USER=root
SHLVL=1
XDG_SESSION_ID=96
XDG_RUNTIME_DIR=/run/user/0
SSH_CLIENT=192.168.231.227 56294 62485
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAIL=/var/mail/root
SSH_TTY=/dev/pts/11
_=/usr/bin/env
root@mciserver:~#
查看所有变量
set
常用系统环境变量
变量名 | 含义 |
---|---|
PATH | 与 windows 环境变量 PATH 功能一样,设置命令的搜索路径, 以冒号为分割 |
HOME | 当前用户目录:/root |
SHELL | 当前 shell 解析器类型:/bin/bash |
HISTFILE | 显示当前用户执行命令的历史列表文件:/root/.bash_history |
PWD | 显示当前所在路径:/root |
OLDPWD | 显示之前的路径 |
HOSTNAME | 显示当前主机名 |
HOSTTYPE | 显示主机的架构 |
LANG | 设置当前系统语言环境:zh_CN.UTF-8 |
【示例】查看PATH环境变量
root@mciserver:~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
root@mciserver:~#
【示例】查看$HISTFILE环境变量
root@mciserver:~# echo $HISTFILE
/root/.bash_history
root@mciserver:~#
2.2 自定义变量
自定义变量分类:自定义局部变量、 自定义常量、自定义全局变量
变量定义规则:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线(_)。
不能使用 Shell 中的关键字作为变量名称。
在 bash 环境中,变量的默认类型都是字符串类型,无法直接进行数值运算。
变量的值如果有空格,必须使用双引号括起来。
定义变量语法
变量名=变量值
注意:等号两边不能有空格
变量值查询:
使用变量名查询 $var_name
使用花括号查询 ${var_name}
区别:花括号方式适合拼接字符串
注意:拼接字符串只能使用{}
【示例】
[webapps@localhost device_stress_test]$ a='abc'
[webapps@localhost device_stress_test]$ echo $abc
[webapps@localhost device_stress_test]$ echo ${a}bc
abcbc
[webapps@localhost device_stress_test]$
删除变量
unset variable_name
变量被删除后不能再次使用,且unset命令不能删除只读变量(常量)
自定义常量
变量设置值以后不可修改的变量叫常量,也叫只读变量。
readonly variable_name
[webapps@localhost device_stress_test]$ myname="mingming"
[webapps@localhost device_stress_test]$ readonly myname
[webapps@localhost device_stress_test]$ myname='jingjing'
-bash: myname: readonly variable
[webapps@localhost device_stress_test]$
自定义全局变量
父子shell环境介绍
例如:有两个shell脚本文件a.sh 和 b.sh。如果在a.sh脚本文件执行了b.sh脚本文件,那么a.sh就是父shell环境,b.sh就是子shell环境。
自定义全局变量就是在当前脚本文件中定义全局变量,这个全局变量可以在当前shell环境与子shell环境中使用。
语法:
export var_name1 var_name2
【示例】测试全局变量在子shell中是否可用
步骤一、创建2个脚本文件test1.sh 和 test2.sh
root@mciserver:~# touch test1.sh test2.sh
步骤二、编辑test1.sh,定义全局变量global_var, 执行test2.sh脚本文件
步骤三、编辑test2.sh,输出全局变量global_var
步骤四、通过test1.sh执行test2.sh脚本文件
root@mciserver:~# sh test1.sh
test1.sh global_var: 100
root@mciserver:~#
自定义系统环境变量
/etc/profile 定义存储自定义系统级环境变量数据,自定义系统级环境变量只需在该文件添加即可。
注意:添加变量后需要重新加载配置文件/etc/profile,因为配置文件修改后要重新加载才能生效。
source /etc/profile
2.6 特殊符号变量
参数 | 说明 |
---|---|
$n | $n:用于接收脚本文件执行时传入的参数 |
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数;如"$*“用引号括起来的情况,以为”$1 $2 $3… $n"的形式输出所有参数 |
$@ | 与 ∗ 相 同 , 但 是 使 用 时 加 引 号 , 并 在 引 号 中 返 回 每 个 参 数 。 如 " *相同,但是使用时加引号,并在引号中返回每个参数。 如" ∗相同,但是使用时加引号,并在引号中返回每个参数。如"@“用引号括起来的情况、以”$1" “ 2 " … " 2" … " 2"…"n” 的形式输出所有参数。 |
$$ | 脚本运行的当前进程ID号 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误 |
∗
与
* 与
∗与@区别
相同点:都是引用所有参数
不同点:只有在引号中体现出来。"
∗
"
获
取
的
所
有
参
数
拼
接
为
一
个
字
符
串
"
*"获取的所有参数拼接为一个字符串 "
∗"获取的所有参数拼接为一个字符串"@"获取一组参数列表对象
2.7 字符串变量
字符串可以用单引号 、双引号、也可以不用引号。
str1='abcd'
str2="abcd"
str3=abcd
echo $str1 $str2 $str3
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;双引号里可以有 变量
字符串中还可以出现双引号的子字符串,但是需要转义
不被引号包围的字符串中出现变量时也会被解析,这一点和双引号“”包围的字符串一 样。字符串中不能出现空格,否则空格后边的字符串会作为其他命令解析(直接输出没 有问题,但不能赋值给其它变量)。
获取字符串的长度:${#字符串变量名}
字符串拼接
截取字符串