bash中的变量类型:
本地变量
局部变量
环境变量
位置变量
特殊变量(内置)
变量命名规范:
1. 只能含字母、数字和下划线,不能以数字开头;
2. 最好不要跟系统已有的环境变量重名;
3. 尽量做到见名知意;
变量介绍:
1. 本地变量:作用域为整个bash进程,子shell中变量失效
# A=33
# echo $A
33
# bash
[root@rs1 ~]# echo $A
// 空,说明子shell中没有A变量的定义
[root@rs1 ~]#
2. 局部变量:在函数中用到的,仅在函数中有作用的变量。
[root@rs1 ~]# local B=22 // 命令行直接定义局部变量失败,语法错误
bash: local: can only be used in a function
#!/bin/bash // 函数定义和调用的脚本
# Function for shell.
test_func(){
local Name=Jerry
echo $Name
}
test_func
echo "Again Name: $Name"
# bash f.sh // 执行结果, 调用函数,A是Jerry,函数以外的A变量并没有定义。
Jerry
Again Name:
3. 环境变量:用export来声明的变量,作用于本shell进程以及其子shell
# A=Jerry
# export A
# sh
sh-4.1# echo $A
Jerry
# 两种定义方法
1. export varname=value // 直接声明并定义
2. varname=value; export varname // 先定义,后声名
4. 位置变量:脚本后面跟的参数,以空格为分割,从左到右依次是$1, $2, $3…,参数的定义使得功能强大了很多
#!/bin/bash // 脚本
# Location variable
echo "First variable is: $1"
echo "Second variable is: $2"
# bash g.sh hello world // 执行结果
First variable is: hello
Second variable is: world
5. 特殊变量:一些特殊意义的变量,系统内置,往往非常重要
特殊变量:
$?: 执行状态返回码
$#:参数的个数
$*: 参数列表, 列出参数
$@:参数列表, 和$*有所不同
shift:shift用于轮换$1, $2...的值,我们可以设置一个$1, 然后shift来实现循环。
#!/bin/bash // 脚本
# Usage of shift.
for i in {1..3}; do
echo $1
shift
done
# bash a.sh first second third // 测试结果, 另外,shift后面加数字,可以定义shift的个数,也就是跳跃。
first
second
third
效果展示:
1. $?:程序状态返回吗(0-255)
$?的取值:
0:没毛病
1, 2: 参数错误
127:命令错误
others: 用于脚本中exit自定义返回值
# ls ~
anaconda-ks.cfg a.sh b.sh c.sh d.sh e.sh f.sh g.sh install.log install.log.syslog
# echo $?
0
# ls /etcc
ls: 无法访问/etcc: 没有那个文件或目录
# echo $?
2
# lll /etc
-bash: lll: command not found
# echo $?
127
2. $#:获取当前shell命令行中参数的总个数,判断为0的时候,直接可以弹出帮助信息
#!/bin/bash // 脚本
# Test usage of $#
if [ $# -eq 0 ]; then
echo "Usage: `basename $0` OPT1, OPT2..."
exit 3
fi
echo "The first option is $1."
# bash h.sh Hello // 两次执行结果
The first option is Hello.
# bash h.sh
Usage: h.sh OPT1, OPT2...
3. $*:获取当前shell的所有参数 “$1 $2 $3 …,受IFS(Internal Field Seperator)控制
#!/bin/bash // 脚本
# Test usage of $*.
echo "The options are: $*"
# ./i.sh Hello World I am me // 执行结果
The options are: Hello World I am me
4. $@:这个程序的所有参数 “$1″ “$2″ “$3″ “…”,不受IFS控制
效果与$*相似,不做介绍
5. $0 获取当前执行的shell脚本的文件名
basename $0就是脚本本身,basename会去掉前导的目录部分后打印"名称"。如果指定的话,还会去掉尾随的"后缀"。
示例:
basename /usr/bin/sort 输出"sort"
basename include/stdio.h .h 输出"stdio",去掉了.h
6. $n 获取当前执行的shell脚本的第n个参数值,n=1..9
不做介绍
7. $$ 获取当前shell的进程号(PID)
# pstree -p |tail -5 可以看到,pstree找到bash的pid,和echo $$结果一致
| `-{rsyslogd}(961)
|-sshd(1137)---sshd(2613)---bash(2615)-+-pstree(3243)
| `-tail(3244)
`-udevd(374)-+-udevd(649)
`-udevd(1393)
# echo $$
2615
8. $! 执行上一个指令的PID
没有测试出来,后续再测试
转载请注明:liutianfeng.com » bash中的变量类型
发表回复
要发表评论,您必须先登录。