变量
1 系统变量
HOME:当前用户家目录
[root@master ~]# echo $HOME
/root
[root@master ~]#
PWD:当前用户
[root@master data]# echo $PWD
/data
SHELL:当前解析器
[root@master data]# echo $SHELL
/bin/bash
USER:当前用户
[root@master data]# echo $USER
root
2 自定义变量
- 简单定义, 变量=值
[root@master data]
[root@master data]
1
- 撤销变量,用 unset 变量名
[root@master data]
[root@master data]
[root@master data]
- 定义静态变量,用 readonly 变量名=值,变量只读,且不能被unset,生命周期和虚拟机进程一样
[root@master data]
[root@master data]
8
[root@master data]
-bash: a: 只读变量
[root@master data]
-bash: unset: a: 无法反设定: 只读 variable
- 变量定义规则
. 变量名由数字、字母、下划线组成,不能数字开头,环境变量名建议全大写
. 等号两侧都不能有空格
. 变量的值如果有空格,需要用单引号或者双引号括起来
. 在bash中变量默认类型都是字符串类型,无法直接进行数值计算
[root@master data]
bash: b: 未找到命令...
[root@master data]
bash: 1: 未找到命令...
[root@master data]
bash: b: 未找到命令...
[root@master data]
[root@master data]
[root@master data]
1+1
[root@master data]
bash: world: 未找到命令...
[root@master data]
[root@master data]
hello world
- 将变量提升为全局环境变量,用export 变量名
[root@master data]
[root@master data]
[root@master data]
echo hello
echo $lan
[root@master data]
hello
[root@master data]
[root@master data]
hello
java
- 查看指定变量,可先用set查看所有变量,然后用grep筛选
[root@master data]
[root@master data]
my_language=java
3 特殊变量
- $n
n为数字,0表示该脚本名称,$1-$9表示第一到第九个参数,从第十个开始需要用{}才能正常显示
[root@master data]
[root@master data]
echo $0
echo $1
echo ${10}
[root@master data]
test.sh
1
10
[root@master data]
./test.sh
1
[root@master data]
./test.sh
1
[root@master data]
- $#
用来获取输入参数的总个数,常用于循环
[root@master data]
echo $0
echo $1
echo ${10}
echo $#
[root@master data]
test.sh
1
5
[root@master data]
- $* 、 $@
当没有双引号包含这两个的时候,都是将接收到的每个参数看作一份数据,彼此之间以空格分隔
当有双引号包含时,$*是将接收到的所有参数当作一个整体,以空格分隔每个参数,而$@还是将每个参数看作一份数据
这里不能是单引号,否则返回$* 和 $@
[root@master data]
for i in $*
do
echo $i
done
echo ----------------------------------
for i in $@
do
echo $i
done
echo ---------------------------------
for i in "$*"
do
echo $i
done
echo ---------------------------------
for i in "$@"
do
echo $i
done
[root@master data]
[root@master data]
1
2
3
----------------------------------
1
2
3
---------------------------------
1 2 3
---------------------------------
1
2
3
[root@master data]
[root@master data]
for i in '$@'
do
echo $i
done
echo ------------------------------
for i in '$*'
do
echo $i
done
[root@master data]
$@
------------------------------
$*
- $? 返回上一条命令执行的返回状态,如果正确执行,返回0,如果非0,则证明上一个命令执行有误
[root@master data]
/data
[root@master data]
0
[root@master data]
-bash: /data: 是一个目录
[root@master data]
126
[root@master data]