Shell编程——变量介绍及使用

Shell编程——变量介绍及使用

变量

变量是临时的保存在当前shell会话中的各种数据,shell脚本语言在定义变量时通常不需要指明类型,直接赋值就可以。

在 shell 中,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。如果需要的话可以使用 Shell declare关键字显式定义变量的类型。

1、系统预定义变量

常用系统变量

$HOME:当前用户主目录

$PWD:当前工作目录的绝对路径

$SHELL:shell解析器

$USER:当前用户

$PATH:系统环境变量 PATH

[root@haoming ~]# echo $HOME
/root
[root@haoming home]# echo $PWD
/home
[root@haoming home]# echo $USER
root
[root@haoming home]# printenv USER   #打印当前用户
root
[root@haoming home]# echo $SHELL
/bin/bash
[root@haoming home]# echo $PATH
/opt/rh/devtoolset-9/root/usr/bin:/usr/java/jdk1.8.0_301-amd64/bin:/usr/java/jdk1.8.0_301-amd64/jre/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/tomcat/apache-tomcat-9.0.52/bin:/root/bin

显示当前系统定义的环境变量:env

显示当前shell的所有变量(系统定义和用户定义的全局和局部变量):set

2、自定义变量

2.1、定义变量语法

Shell 支持以下三种定义变量的方式:

variable=value
variable='value'
variable="value"

variable 是变量名,value 是赋给变量的值。如果 value 不包含任何空白符(例如空格、Tab 缩进等),那么可以不使用引号;如果 value 包含了空白符,那么就必须使用引号(单引号和使用双引号)包围起来。

等号的两侧不能有空格。

变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。

使用实例:

[root@haoming home]# url=www.baidu.com
[root@haoming home]# echo $url
www.baidu.com
[root@haoming home]# name='百度'
[root@haoming home]# echo $name
百度
[root@haoming home]# author="皓明"
[root@haoming home]# echo $author
皓明
#修改变量name的值,已定义的变量可以被重新赋值
[root@haoming home]# name="逍 遥"
[root@haoming home]# echo $name
逍 遥

使用单引号双引号的区别

以单引号' '包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令(命令需要反引起来)也会把它们原样输出。这种方式比较适合定义显示纯字符串的情况,即不希望解析变量、命令等的场景。单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

以双引号" "包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。这种方式比较适合字符串中附带有变量和命令并且想将其解析后再输出的变量定义。双引号里可以出现转义字符

提升变量作用域 export

上面我们自定义的变量为局部变量,在父shell中可见,但在子shell中不可见,

可以在父shell中使用 export 变量名 的方式把局部变量提升为全局变量,这样在子shell中变量也是可见的:

[root@haoming home]# ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
root      5216  5213  0 14:29 pts/2    00:00:00 -bash
root      9569  5216  0 15:09 pts/2    00:00:00 ps -f
[root@haoming home]# echo $name
逍 遥
[root@haoming home]# bash
[root@haoming home]# echo $name
#在子shell中不可见

[root@haoming home]# exit    #退出子shell
exit
[root@haoming home]# export name  #把局部变量提升为全局变量
[root@haoming home]# bash
[root@haoming home]# echo $name  #在子shell中变量变为可见
逍 遥

2.2、只读变量和删除变量

只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

[root@haoming home]# readonly age=18
[root@haoming home]# age=19
-bash: age: readonly variable  age:只读变量
[root@haoming home]# echo $age
18

删除变量

使用 unset 命令可以删除变量。语法:

unset 变量名

变量被删除后不能再次使用。unset 命令不能删除只读变量。

[root@haoming home]# unset name
[root@haoming home]# echo $name
#没有输出
[root@haoming home]# unset $age
-bash: unset: `18': not a valid identifier 

2.3、特殊变量

2.3.1、特殊变量

变量 含义
$0 当前脚本的文件名。
$n(n≥1) 位置参数,传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。当被双引号" "包含时,$@ 与 $* 稍有不同。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。

2.3.2、位置参数

运行 Shell 脚本文件时我们可以给它传递一些参数,这些参数在脚本文件内部可以使用$n的形式来接收,例如,$1 表示第一个参数,$2表示第二个参数,依次类推,十以上的参数需要用大括号表示,如${10}

这种通过$n的形式来接收的参数,在 Shell 中称为位置参数。

使用实例:

#编写shell文件
[root@haoming home]# vim test1.sh 
#!/bin/bash
echo '=====$n====='
echo script name: $0
echo 1st paramater:$1
echo 2nd paramater:$2
#赋予脚本文件执行权限
[root@haoming home]# chmod +x test1.sh 
#执行脚本文件,并传递参数
[root@haoming home]# ./test1.sh  xiaiyao haoming
=====$n=====
script name: ./test1.sh
1st paramater:xiaiyao
2nd paramater:haoming

$#:传递给脚本或函数的参数个数,常用于循环,判断参数的个数是否正确以及加强脚本的健壮性。

#!/bin/bash
echo script name: $0
echo 1st paramater:$1
echo 2nd paramater:$2
echo "参数个数为:$#"

#执行脚本,输出结果如下所示:
[root@haoming home]# ./test1.sh  xiaiyao haoming
script name: ./test1.sh
1st paramater:xiaiyao
2nd paramater:haoming
参数个数为:2

$*:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体

$@:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待

只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。

$?:上个命令的退出状态,或函数的返回值。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行出问题了。

2.4、变量运算

默认情况下,Shell 不会直接进行算术运算,而是把运算符两边的数据(数值或者变量)当做字符串,把运算符当做字符串连接符,最终的结果是把两个字符串拼接在一起形成一个新的字符串:

[root@haoming home]# echo 2+4
2+4
[root@haoming home]# a=12
[root@haoming home]# b=$a+34
[root@haoming home]# echo $b
12+34

要想让数学计算发挥作用,必须使用数学计算命令,Shell 中常用的数学计算命令如下表所示:

运算操作符/运算命令 说明
(( )) 用于整数运算,效率很高,推荐使用
let 用于整数运算,和 (()) 类似。
$[] 用于整数运算,不如 (()) 灵活。
expr expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
bc Linux下的一个计算器程序,可以处理整数和小数。Shell 本身只支持整数运算,想计算小数就得使用 bc 这个外部的计算器。
declare -i 将变量定义为整数,然后再进行数学运算时就不会被当做字符串了。功能有限,仅支持最基本的数学运算(加减乘除和取余),不支持逻辑运算、自增自减等,所以在实际开发中很少使用。
[root@haoming home]# echo $((12*13))
156
[root@haoming home]# ((b=12*13))
[root@haoming home]# echo $b
156
[root@haoming home]# a=$((2*3))
[root@haoming home]# echo $a
6
[root@haoming home]# echo $((1+2*3-4%3))
6

猜你喜欢

转载自blog.csdn.net/wpc2018/article/details/125263262