变量存在于内存中,变量有变量名识别,调用变量时使用"$变量名",标记变量的是变量名。
环境变量就是运行在"环境"上下文的,在这个上下文都可以引用。例如,常见的cd、ls等命令严格来说应该使用绝对路径如/bin/ls来执行,由于/bin目录加入到了PATH环境变量中,系统自己会去寻找PATH下的路径是否有该命令。
环境变量常用的大写字母表示。常见的环境变量:
环境变量 | 说明 |
---|---|
HOSTNAME | 当前主机名 |
SHELL | Shell 的路径即 bash 的类型 |
HISTSIZE | history 保存多少条记录 |
USER | 当前用户名 |
PATH | 自动搜索路径 |
PWD | 当前目录 |
LANG | 使用的语言(临时修改语系时使用该变量) |
HOME | 当前用户的家目录 |
LOGNAME | 当前登录的用户 |
使用 env
或export
命令可以查看当前用户的环境变量。使用echo
可以输出变量的值。
echo $path
/usr/local/bin /usr/bin /home/simon/bin /usr/local/sbin /usr/sbin
例如:
在 PATH 环境变量中,添加一个新的路径
PATH=/usr/local/mysql/bin:$PATH
当对变量本身进行操作,则不使用$,当对变量值进行操作,则使用$。
脚本语言是弱类型语言,变量通常不需要特地声明甚至不需要初始化,在脚本运行时由解释器进行解释运算,解释器知道变量在什么时候是什么类型,所以直接赋值即可。
bash 中,变量默认都是字符串类型,不论是否使用引号赋值,默认都以字符串方式存储。
1.变量的赋值方式
str=string
,注意等号左右没有空格。如果有空格就是进行比较运算符的比较运算。
2.变量的引用方式
$str
或 ${str}
,如echo "the var is ${str}"
str='Hello,world!'
echo "the var is ${str}"
the var is Hello,world!
3.释放变量
unset str
,注意变量名前不加前缀"$"。
unset str
4.查看所有变量
不接任何参数的 set
或 declare
命令,输出的结果包含了普通变量和环境变量。
5.定义只读变量
readonly str
,只读变量无法修改变量的值也无法 unset 变量,只有重新登录 shell 从能继续使用只读变量。
6.临时将普通变量升级为环境变量
export str
或者赋值时export str=value
,这样$str 就可以在当前 shell 和子 shell 中使用,但退出脚本或重新登录 shell 都会取消 export所定义的临时环境变量。
str='Hello';echo $str
Hello
bash #开启子 shell
echo $str #子 shell 中查看变量没有值
$str 的作用域只在当前 shell,要想在子 shell 中也能引用普通变量,需要使用 export 将普通变量升级为环境变量。
exit #退出子 shell
export str #在父 shell 中将普通变量修改为环境变量
bash
echo $str
Hello
普通变量在脚本结束或退出登录后就失效了,并别只对当前 shell 有效,其他用户和当前用户的子 shell 都无法使用。
使用 export 可以升级为临时局部的环境变量,只对当前用户的当前 shell 和子 shell 有效,退出脚本和退出登录后也失效。
设置永久且全局的变量的方法
将变量的设置语句放入 /etc/profile 文件中,因为每个用户登录时,都会调用该文件并执行其中的语句。如果想立即生效加载此文件着的配置使临时添加的设置生效,需要 source 该文件。
source /etc/profile
/etc/profile 文件是 bash 的全局配置文件,还有针对每个用户的配置文件~/.bash_profile,此文件中的配置将只对对应的用户生效。
在使用${}
方式引用变量时,在变量名前加上#就可以查看该变量的字符串长度。空格也算长度。
echo ${#str}
5
echo ${#PATH}
286
声明变量使用 declare 命令。
declare +|- 变量名 | |
---|---|
-|+ | 给变量设置属性类型,取消给变量设定的类型属性 |
-i | 声明为整型 |
-x | 声明为环境变量 |
-p | 显示变量名和值 |
例如:
声明一个环境变量:declare -x str
取消该变量:declare +x str
变量 | 说明 |
---|---|
$? | 上一条命令的回传指令,回传0表示标准输出,即正确执行,否则为标准错误输出 |
$$ | 当前 shell 的 PID,除了执行 bash 命令和 shell 脚本时,$$不会继承父 shell的值,其他类型的子shell 都继承 |
$BASHPID | 当前 shell 的 PID,每个 shell 的$BASHPID是独立的,$$有时候会继承父shell 的值 |
$! | 最近一直执行的后台进程 PID |
$# | 统计参数的个数 |
$@ | 所有单个参数,如"a""b""c" |
$* | 所有参数的整体,如"abc" |
$0 | 脚本名 |
$1...$n | 参数位置 |
示例:使用下面的脚本来验证特殊变量和位置变量
#! /bin/bash
echo '$?:'$?
echo '$$:'$$
echo '$!:'$!
echo '$#:'$#
echo '$@:'$@
echo '$*:'$*
echo '$0:'$0
echo '$1:'$1
echo '$2:'$2
echo '$3:'$3
echo '$4:'$4
使用5个参数来运行脚本
[root@localhost ~]# sh ./var.sh a b c d e
$?:0
$$:9373
$!:
$#:5
$@:a b c d e
$*:a b c d e
$0:./var.sh
$1:a
$2:b
$3:c
$4:d
使用shift [N]
可以指定参数轮替,每执行一次 shift N,就踢掉 N 个参数,默认 N=1。
例如在脚本中:
echo $1 #输出第一个参数值
shift 2 #踢掉前两个参数,$1的值变成第三个参数的值
shfit #再踢掉一个参数,$1的值变成第四个参数的值
echo $1 #输出第四个参数的值
1.变量的赋值
其中 ${parameter:-word} 最常用,最后两个是截取字符串的,偶尔也会用到。
2.脚本配置文件
配置文件中的变量值可以在脚本中被使用。
要在脚本中调用配置文件,直接使用`source config_file`或`. config_file`
服务启动脚本支持配置文件:/etc/sysconfig/服务脚本同名的配置文件
3.局部变量
在函数中定义局部变量中使其不影响函数外的同名变量。
定义方式:`local VAR_NAME=`
4.命令 mktemp 创建临时目录
mktemp [-d] /tmp/file.XXX #X指定的越多,随机生成的后缀就越长,其中-d 表示创建临时目录
例如:
[root@localhost ~]# mktemp temp.XXX
temp.kAc
[root@localhost ~]# mktemp -d temp.XXX
temp.Toy
[root@localhost ~]# touch temp.Toy/A.txt
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。