前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Shell 编程(2)- 变量

Shell 编程(2)- 变量

原创
作者头像
懒人的小脑
修改2019-01-28 09:41:32
7790
修改2019-01-28 09:41:32
举报

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

环境变量

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

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

环境变量

说明

HOSTNAME

当前主机名

SHELL

Shell 的路径即 bash 的类型

HISTSIZE

history 保存多少条记录

USER

当前用户名

PATH

自动搜索路径

PWD

当前目录

LANG

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

HOME

当前用户的家目录

LOGNAME

当前登录的用户

使用 envexport命令可以查看当前用户的环境变量。使用echo可以输出变量的值。

代码语言:txt
复制
echo $path
/usr/local/bin /usr/bin /home/simon/bin /usr/local/sbin /usr/sbin

例如:

在 PATH 环境变量中,添加一个新的路径

代码语言:txt
复制
PATH=/usr/local/mysql/bin:$PATH

对变量本身进行操作,则不使用$,当对变量值进行操作,则使用$

普通变量

脚本语言是弱类型语言,变量通常不需要特地声明甚至不需要初始化,在脚本运行时由解释器进行解释运算,解释器知道变量在什么时候是什么类型,所以直接赋值即可。

bash 中,变量默认都是字符串类型,不论是否使用引号赋值,默认都以字符串方式存储。

1.变量的赋值方式

str=string,注意等号左右没有空格。如果有空格就是进行比较运算符的比较运算。

2.变量的引用方式

$str${str},如echo "the var is ${str}"

代码语言:txt
复制
str='Hello,world!'
echo "the var is ${str}"
the var is Hello,world!

3.释放变量

unset str,注意变量名前不加前缀"$"。

代码语言:txt
复制
unset str

4.查看所有变量

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

5.定义只读变量

readonly str,只读变量无法修改变量的值也无法 unset 变量,只有重新登录 shell 从能继续使用只读变量。

6.临时将普通变量升级为环境变量

export str或者赋值时export str=value,这样$str 就可以在当前 shell 和子 shell 中使用,但退出脚本或重新登录 shell 都会取消 export所定义的临时环境变量。

代码语言:txt
复制
str='Hello';echo $str
Hello

bash             #开启子 shell
echo $str        #子 shell 中查看变量没有值

$str 的作用域只在当前 shell,要想在子 shell 中也能引用普通变量,需要使用 export 将普通变量升级为环境变量。

代码语言:txt
复制
exit #退出子 shell
export str #在父 shell 中将普通变量修改为环境变量
bash
echo $str
Hello

变量的生命周期

普通变量在脚本结束或退出登录后就失效了,并别只对当前 shell 有效,其他用户和当前用户的子 shell 都无法使用。

使用 export 可以升级为临时局部的环境变量,只对当前用户的当前 shell 和子 shell 有效,退出脚本和退出登录后也失效。

设置永久且全局的变量的方法

将变量的设置语句放入 /etc/profile 文件中,因为每个用户登录时,都会调用该文件并执行其中的语句。如果想立即生效加载此文件着的配置使临时添加的设置生效,需要 source 该文件。

代码语言:txt
复制
source /etc/profile

/etc/profile 文件是 bash 的全局配置文件,还有针对每个用户的配置文件~/.bash_profile,此文件中的配置将只对对应的用户生效。

获取变量的长度

在使用${}方式引用变量时,在变量名前加上#就可以查看该变量的字符串长度。空格也算长度。

代码语言:txt
复制
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

参数位置

示例:使用下面的脚本来验证特殊变量和位置变量

代码语言:txt
复制
#! /bin/bash

echo '$?:'$?
echo '$$:'$$
echo '$!:'$!
echo '$#:'$#
echo '$@:'$@
echo '$*:'$*
echo '$0:'$0
echo '$1:'$1
echo '$2:'$2
echo '$3:'$3
echo '$4:'$4

使用5个参数来运行脚本

代码语言:txt
复制
[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。

例如在脚本中:

代码语言:txt
复制
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 创建临时目录

代码语言:javascript
复制
mktemp [-d] /tmp/file.XXX #X指定的越多,随机生成的后缀就越长,其中-d 表示创建临时目录

例如:

代码语言:javascript
复制
[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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 环境变量
  • 普通变量
  • 变量的生命周期
  • 获取变量的长度
  • 声明变量
  • 位置变量和特殊变量
  • 轮替变量
  • shell 的其他基础
  • 变量的切分提取和替换(待更新)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档