Skip to content

三、变量

shell 编程中变量分为三种,分别是系统变量、环境变量和用户变量,Shell 变量名 在定义时,首个字符必须为字母(a-z,A-Z),不能以数字开头,中间不能有空格,可 以使用下划线(_),不能使用(-),也不能使用标点符号等

例如定义变量 A=haha.cn,定义这样一个变量,A 为变量名,haha.cn 是变量的 值,变量名有格式规范,变量的值可以随意指定。变量定义完成,如需要引用变量,可以使用$A。

sh
#!/bin/bash
#By author xueqimiao 
A=haha.cn
echo “Printf variables is $A.”

1、系统预定义变量

1、常用系统变量

sh
PATH 命令所示路径,以冒号为分割;
HOME 打印用户家目录;
SHELL 显示当前 Shell 类型;
USER 打印当前用户名;
ID 打印当前用户 id 信息;
PWD 显示当前所在路径;
TERM 打印当前终端类型;
HOSTNAME 显示当前主机名

2、查看系统变量的值

sh
echo $HOME

3、显示当前 Shell 中所有变量:set

sh
set

2、自定义变量

1、基本语法

  1. 定义变量:变量名=变量值,注意,=号前后不能有空格
  2. 撤销变量:unset 变量名
  3. 声明静态变量:readonly 变量,注意:不能 unset

2、变量定义规则

  1. 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
  2. 等号两侧不能有空格
  3. 在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算。
  4. 变量的值如果有空格,需要使用双引号或单引号括起来。

3、案例实操

  1. 定义变量 A
SH
[root@k8s-node shells]$ A=5
[root@k8s-node shells]$ echo $A
5
  1. 给变量 A 重新赋值
SH
[root@k8s-node shells]$ A=8
[root@k8s-node shells]$ echo $A
8
  1. 撤销变量 A
SH
[root@k8s-node shells]$ unset A
[root@k8s-node shells]$ echo $A
  1. 声明静态的变量 B=2,不能 unset
sh
[root@k8s-node shells]$ readonly B=2
[root@k8s-node shells]$ echo $B
2
[root@k8s-node shells]$ B=9
-bash: B: readonly variable
  1. 在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算
sh
[root@k8s-node ~]$ C=1+2
[root@k8s-node ~]$ echo $C
1+2
  1. 变量的值如果有空格,需要使用双引号或单引号括起来
sh
[root@k8s-node ~]$ D=I love banzhang
-bash: world: command not found
[root@k8s-node ~]$ D="I love banzhang"
[root@k8s-node ~]$ echo $D
I love banzhang
  1. 可把变量提升为全局环境变量,可供其他 Shell 程序使用
sh
export 变量名

在 helloworld.sh 文件中增加 echo $B

sh
#!/bin/bash
echo "helloworld"
echo $B
sh
[root@k8s-node shells]$ ./helloworld.sh
Helloworld

发现并没有打印输出变量 B 的值。

sh
[root@k8s-node shells]$ export B
[root@k8s-node shells]$ ./helloworld.sh
helloworld
2

3、特殊变量

1、$n

1、基本语法

$n (功能描述:n 为数字,$0 代表该脚本名称,$1-$9 代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})

2、案例实操

sh
[root@k8s-node shells]$ touch parameter.sh
[root@k8s-node shells]$ vim parameter.sh
#!/bin/bash
echo '==========$n=========='
echo $0
echo $1
echo $2
[root@k8s-node shells]$ chmod 777 parameter.sh
[root@k8s-node shells]$ ./parameter.sh cls xz
==========$n==========
./parameter.sh
cls xz

2、$#

1、基本语法

$# (功能描述:获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及加强脚本的健壮性)。

2、案例实操

sh
[root@k8s-node shells]$ vim parameter.sh
#!/bin/bash
echo '==========$n=========='
echo $0
echo $1
echo $2
echo '==========$#=========='
echo $#
[root@k8s-node shells]$ chmod 777 parameter.sh
[root@k8s-node shells]$ ./parameter.sh cls xz
==========$n==========
./parameter.sh
cls
xz
==========$#==========
2

3、$*、$@

1、基本语法

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

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

2、案例实操

sh
[root@k8s-node shells]$ vim parameter.sh
#!/bin/bash
echo '==========$n=========='
echo $0
echo $1
echo $2
echo '==========$#=========='
echo $#
echo '==========$*=========='
echo $*
echo '==========$@=========='
echo $@
[root@k8s-node shells]$ ./parameter.sh a b c d e f g ==========$n==========
./parameter.sh
a
b
==========$#==========
7
==========$*==========
abcdefg
==========$@==========
abcdefg

4、$?

1、基本语法

$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)

2、案例实操

判断 helloworld.sh 脚本是否正确执行

sh
[root@k8s-node shells]$ ./helloworld.sh
hello world
[root@k8s-node shells]$ echo $?
0