Shell变量
变量类型
- 系统环境变量
- 自定义变量
- 特殊符号变量
系统环境变量
Shell的配置文件分类
- 全局配置文件 /etc/profile /etc/profile.d/*.sh /etc/bashrc
- 个人配置文件 当前用户/.bash_profile 当前用户/.bashrc
一般情况下,我们都是直接针对全局配置进行操作。
环境变量分类
在Linux系统中,环境变量按照其作用范围不同大致可以分为系统级环境变量和用户级环境变量。
系统级环境变量:Shell环境加载全局配置文件中的变量共享给所有用户所有Shell程序使用, 全局共享
用户级环境变量:Shell环境加载个人配置文件中的变量共享给当前用户的Shell程序使用, 登录用户使用
查看当前Shell系统环境变量
命令:env
[root@node1 export] env
SHELL=/bin/bash
HISTSIZE=1000
USER=root
...省略
[root@node1 export]
查看所有Shell变量(系统环境变量+自定义变量+函数)
命令: set
[root@node1 export] set
ABRT_DEBUG_LOG=/dev/null
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
...省略
[root@node1 export]
常用系统环境变量
变量名称 | 含义 |
---|---|
PATH | 与windows环境变量PATH功能一样,设置命令的搜索路径,以冒号为分割 |
HOME | 当前用户主目录:/root |
SHELL | 当前shell解析器类型:/bin/bash |
HISTFILE | 显示当前用户执行命令的历史列表文件:/root/.bash_history |
PWD | 显示当前所在路径:/root |
OLDPWD | 显示之前的路径 |
HOSTNAME | 显示当前主机名:itheima |
HOSTTYPE | 显示主机的架构,是i386、i686、还是x86、x64等:x86_64 |
LANG | 设置当前系统语言环境:zh_CN.UTF-8 |
[root@node1 export] echo $PATH
:/export/server/jdk1.8.0_241/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/export/server/mysql-5.7.29/bin:/root/bin
[root@node1 export] echo $HOME
/root
[root@node1 export] echo $SHELL
/bin/bash
[root@node1 export] echo $HISTFILE
/root/.bash_history
[root@node1 export] echo $PWD
/export
[root@node1 export] echo $OLDPWD
/root
[root@node1 export] echo $HOSTNAME
node1
[root@node1 export] echo $HOSTTYPE
x86_64
[root@node1 export] echo $LANG
zh_CN.UTF-8
自定义变量
分类
- 自定义局部变量
- 自定义常量
- 自定义全局变量
定义
定义变量的语法
var_name=hello
变量定义规则
- 变量名称可以有字母,数字和下划线组成, 但是不能以数字开头
- 等号两侧不能有空格
- 在bash环境中, 变量的默认类型都是字符串类型, 无法直接进行数值运算
- 变量的值如果有空格, 必须使用双引号括起来
- 不能使用Shell的关键字作为变量名称
# 定义变量
[root@node1 ~] name=熊猫同学呀
使用
查询变量的语法
语法1: 直接使用变量名查询
$var_name
语法2: 使用花括号
${var_name}
区别: 花括号方式适合拼接字符串
[root@node1 ~] name=熊猫同学呀
[root@node1 ~] echo "我是$name"
我是熊猫同学呀
[root@node1 ~] echo "我是$name的同学"
我是熊猫同学呀的同学
[root@node1 ~] echo "我是${name}haha"
我是熊猫同学呀haha
[root@node1 ~] echo "我是$namehaha"
我是
注意: 如果我是$namehaha
中 $name
不带花括号, 系统会认为获取$namehaha
变量数据, 这个变量不存在就获取不到数据
结论: 变量需要拼接字符的使用花括号
变量删除
删除变量的语法
unset var_name
[root@node1 ~] name=熊猫同学呀
[root@node1 ~] echo $name
熊猫同学呀
[root@node1 ~] unset name
[root@node1 ~] echo $name
[root@node1 ~]
特殊变量
特殊变量:$n
用于接收脚本文件执行时传入的参数
$0
用于获取当前脚本文件名称的
$n
用于获取第n个参数
有些版本:
$1
~$9
, 代表获取第一输入参数到第9个输入参数
第10个以上的输入参数获取参数的格式:${数字}
, 否则无法获取出
我的是centos7.7,不用加花括号也可以正常输出
#!/bin/bash
echo 脚本文件名:${0}
echo 脚本接收的第1个参数:$1
echo 脚本接收的第2个参数:$2
echo 脚本接收的第3个参数:$3
echo 脚本接收的第10个参数:${10}
echo 脚本接收的第11个参数:$11
[root@node1 ~] cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
[root@node1 ~] sh demo.sh 1 2 3 4 5 6 7 8 9 10 11
脚本文件名:demo.sh
脚本接收的第1个参数:1
脚本接收的第2个参数:2
脚本接收的第3个参数:3
脚本接收的第10个参数:10
脚本接收的第11个参数:11
特殊变量:$#
获取所有输入参数的个数
#! /bin/bash
echo 脚本文件名:${0}
echo 脚本接收的第1个参数:$1
echo 脚本接收的第2个参数:$2
echo 脚本接收的参数个数:$#
[root@node1 ~] sh demo.sh 1 2 3
脚本文件名:demo.sh
脚本接收的第1个参数:1
脚本接收的第2个参数:2
脚本接收的参数个数:3
特殊变量:$*
、$@
$*
,$@
都是获取所有输入参数, 用于以后输出所有参数
1.不使用双引号括起来, 功能一样
$*
和$@
获取所有输入参数,格式为:$1 $2 ... $n
$*
与$@
区别
2.使用双引号括起来
$*
获取的所有参数拼接为一个字符串, 格式为:"$1 $2 ... $n"
$@
获取一组参数列表对象, 格式为:"$1" "$2" ... "$n"
使用循环打印所有输入参数可以看出区别
#! /bin/bash
echo '使用$*直接输出:'$*
echo '使用$@直接输出:'$@
echo '循环遍历输出不带引号$@所有参数'
for item in $@
do
echo $item
done
echo '循环遍历输出不带引号$*所有参数'
for item in $*
do
echo $item
done
echo '循环遍历输出带引号$*所有参数'
for item in "$*"
do
echo $item
done
echo '循环遍历输出带引号$@所有参数'
for item in "$@"
do
echo $item
done
[root@node1 ~] sh demo2.sh a b c
使用$*直接输出:a b c
使用$@直接输出:a b c
循环遍历输出不带引号$@所有参数
a
b
c
循环遍历输出不带引号$*所有参数
a
b
c
循环遍历输出带引号$*所有参数
a b c
循环遍历输出带引号$@所有参数
a
b
c
特殊变量:$?
用于获取上一个Shell命令的退出状态码, 或者是函数的返回值
每个Shell命令的执行都有一个返回值, 这个返回值用于说明命令执行是否成功
一般来说, 返回0代表命令执行成功, 非0代表执行失败
# 输入一个正确命令, 再输出`$?`
[root@node1 ~] echo "hello"
hello
[root@node1 ~] echo $?
0
# 输入一个错误命令, 在输出`$?`
[root@node1 ~] hello
-bash: hello: 未找到命令
[root@node1 ~] echo $?
127
特殊变量:$$
用于获取当前Shell环境的进程ID号
[root@node1 ~] echo $$
107246
[root@node1 ~] ps -aux|grep bash
root 107246 0.0 0.0 116216 2944 pts/1 Ss 07:29 0:00 -bash
root 107282 0.0 0.0 116096 2660 pts/2 Ss 07:29 0:00 -bash
Shell变量总结
变量类型
- 环境变量
- 自定义变量
- 特殊变量
作用域
- 环境变量
系统Shell配置文件提供, 全局都可以使用 - 自定义变量
局部变量: 当前Shell可以使用
全局变量: 当前Shell与子Shell可以使用 - 特殊变量
全局都可以使用
常用系统环境变量
变量名称 | 含义 |
---|---|
PATH | 与windows环境变量PATH功能一样,设置命令的搜索路径,以冒号为分割 |
HOME | 当前用户主目录:/root |
SHELL | 当前shell解析器类型:/bin/bash |
HISTFILE | 显示当前用户执行命令的历史列表文件:/root/.bash_history |
PWD | 显示当前所在路径:/root |
OLDPWD | 显示之前的路径 |
HOSTNAME | 显示当前主机名:itheima |
HOSTTYPE | 显示主机的架构,是i386、i686、还是x86、x64等:x86_64 |
LANG | 设置当前系统语言环境:zh_CN.UTF-8 |
常用系统特殊符号变量
特殊变量 | 含义 |
---|---|
$n | 获取传入脚本的第n个参数 |
$# | 获取传入脚本的所有参数个数 |
$* 与 $@ | 获取传入脚本的所有参数 |
$? | 上一条命令的返回值 |
$$ | 当前进程的PID |