Shell 编程(2)- 变量

变量存在于内存中,变量有变量名识别,调用变量时使用"$变量名",标记变量的是变量名。

环境变量

环境变量就是运行在"环境"上下文的,在这个上下文都可以引用。例如,常见的cd、ls等命令严格来说应该使用绝对路径如/bin/ls来执行,由于/bin目录加入到了PATH环境变量中,系统自己会去寻找PATH下的路径是否有该命令。

环境变量常用的大写字母表示。常见的环境变量:

环境变量

说明

HOSTNAME

当前主机名

SHELL

Shell 的路径即 bash 的类型

HISTSIZE

history 保存多少条记录

USER

当前用户名

PATH

自动搜索路径

PWD

当前目录

LANG

使用的语言(临时修改语系时使用该变量)

HOME

当前用户的家目录

LOGNAME

当前登录的用户

使用 envexport命令可以查看当前用户的环境变量。使用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.查看所有变量

不接任何参数的 setdeclare 命令,输出的结果包含了普通变量和环境变量。

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 #输出第四个参数的值

shell 的其他基础

1.变量的赋值

  • ${parameter:-word}:如果 parameter 为空或未定义,则变量展开为“word”;否则展开为 parameter 的值
  • ${parameter-word}:和 ${parameter:-word}几乎等价,除了 parameter 设置了但为空时,变量的结果时 null,而不是 word。在/etc/init.d/http.d 中有此用法
  • ${parameter:+word}:如果 parameter 为空或未定义,不做任何操作,即仍然为空;否则展开为 "word" 值
  • ${parameter:=word}:如果 parameter 为空或未定义,则变量赋值(注意不是展开)为"word";否则为 parameter 本身
  • ${parameter:offset}:取子串,从offset处的后一个字符开始取到最后一个字符
  • ${parameter:offset:length}:取子串,从offset处的后一个字符开始,取lenth长的子串

其中 ${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

变量的切分提取和替换(待更新)

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券