bash中的变量类型

Shell Liemer_Lius 1130℃ 0评论

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中的变量类型

喜欢 (0)

发表回复