自定义局部变量
:定义在一个脚本文件中的变量 只能在这个脚本文件中使用的变量,局部变量
语法: var_name=value
变量定义规则
-
变量名称可以有字母,数字和下划线组成, 但是不能以数字开头
-
等号两侧不能有空格
-
在bash环境中, 变量的默认类型都是字符串类型, 无法直接进行数值运算
-
变量的值如果有空格, 必须使用双引号括起来
-
不能使用Shell的关键字作为变量名称
如:var1=it
变量查询:
echo $var_name
echo ${var_name} 花括号适合拼接字符串1
如:echo $var1
输出 it
echo "my name is ${var1}123"
输出 my name is it123
变量删除:
unset var_name
自定义常量
:变量设置值以后不可以修改的变量叫常量 ,只读变量
readonly var_name
如:var3=itt
readonly var3 设置var3为只读变量
var3=qqq 无法修改只读变量
自定义全局变量
:在当前脚本文件中定义全局变量,
这个全局变量可以在当前shell环境与子shell环境中都可以使用
父子shell环境
:由两个shell脚本文件 A.sh B.sh ,在A.sh脚本文件中执行B.sh脚本文件,
A.sh就是父shell环境,B.sh就是子shell环境
全局变量语法: export var_name1 var_name2
案例:测试全局变量在子shell中是否可用 在父shell中是否可用
需求: 1、创建2个脚本文件 demo2.sh demo3.sh
touch demo2.sh demo3.sh
2、编辑demo2.sh
vim demo2.sh
命令1:定义全局变量 var4
var4=itt
export var4
命令2:执行demo3.sh脚本文件
sh demo3.sh
3、编辑demo3.sh
vim demo3.sh
输出全局变量var4
echo "在demo3.sh文件中输出var4变量:${var4}"
4、执行demo2.sh脚本文件
sh demo2.sh
结论:全局变量在当前shell环境与子shell环境中可用,父shell环境中不可用
特殊变量 $n
:用于接收脚本文件执行时传入的参数
$0 获取当前脚本文件名
$1-$9 获取第1个到第9个输入参数
${数字} 获取第10个及以上的输入参数
执行脚本文件 传入参数语法 sh 脚本文件 参数1 参数2 ......
案例:创建脚本文件demo4.sh 在脚本文件内部执行打印脚本文件名字、参数
需求: 1、touch demo4.sh
2、编辑demo4.sh文件内容
#!/bin/bash
#命令1 打印当前脚本文件
echo "当前脚本文件名称:${0}"
#命令2 打印第1个输入参数
echo "第1个输入参数:${1}"
#命令3 打印第2个输入参数
echo "第2个输入参数:${2}"
#命令4 打印第10个输入参数
echo "第10个输入参数不带花括号:$10" 获取结果不一样 相当于 $1 拼接上 0
echo "第10个输入参数带花括号:${10}"
3、执行脚本文件demo4.sh
特殊变量 $# 获取所有输入参数的个数
特殊变量 $* $@ 获取所有输入参数 用于输出所有参数
1、不用双引号括起来, 功能一样
$*和$@获取所有输入参数,格式为: $1 $2 ... $n
2、使用双引号括起来
"$*"获取的所有参数拼接为一个字符串, 格式为: "$1 $2 ... $n"
"$@"获取一组参数列表对象, 格式为: "$1" "$2" ... "$n"
使用循环打印所有输入参数可以看出区别
for var in 列表变量
do # 循环开始
命令 # 循环体
done # 循环结束
# 增加命令: 实现直接输出所有输入后参数
echo '使用$*直接输出:'$*
echo '使用$@直接输出:'$@
# 增加命令: 使用循环打印输出所有输入参数
echo '循环遍历输出$*所有参数'
for item in "$*"
do
echo $item
done
echo '循环遍历输出$@所有参数'
for item in "$@"
do
echo $item
done
特殊变量 $?
用于获取上一个Shell命令的退出状态码, 或者是函数的返回值
每个Shell命令的执行都有一个返回值, 这个返回值用于说明命令执行是否成功
一般来说, 返回0代表命令执行成功, 非0代表执行失败
特殊变量 $$
用于获取当前Shell环境的进程ID号
查看shell环境的进程号 ps -aux | grep bash
echo $$ 显示当前shell环境的进程编号