shell中的变量——详解

一 . 什么是变量

变量是用来存储非固定值的载体,它具有一个值,以及零个或多个属性。

二 . 变量的分类

根据用法可以分为:自定义变量,环境变量,位置变量

1.自定义变量
语法格式:
NAME=[value]
当value没有指定,变量将被赋值为空字符串;当变量定义后,使用 <$变量名称> 来调用变量的值。

注意:变量名称为字母、数字及下划线的组合,但首字母不能为数字,变量名称没有硬性要求大小写,建议统一使用大写或首字母大写。

默认NAME的值是可以修改的,可以通过typeset这个命令为变量添加只读属性(readonly)来防止误操作,如果需要限定变量的值设置为整数,也可以使用该命令添加相应的属性。下面通过例子演示

[root@localhost 桌面]# NAME=hello
[root@localhost 桌面]# echo $NAME
hello
[root@localhost 桌面]# typeset -r NAME                        //使用-r选项设置只读属性
[root@localhost 桌面]# NAME=hi
bash: NAME: 只读变量

如果希望预先定义一个变量,但暂时不赋值给他,可以使用declare命令。如下例:

[root@localhost 桌面]# declare NAME1
[root@localhost 桌面]# typeset -i NAME1                      //使用-i选项设置整数变量
[root@localhost 桌面]# NAME1=hello                           //强制为该变量赋值字符型数据
[root@localhost 桌面]# echo $NAME1                           //查看变量结果为0
0
[root@localhost 桌面]# NAME1=521
[root@localhost 桌面]# echo $NAME1
521

还可以通过read命令来设置变量,read可以从标准输入中读取变量的值,使用-p选项可以添加相应的提示信息。如下例:

[root@localhost 桌面]# read NAME2                             //回车后输入要给该变量赋值的值
1314
[root@localhost 桌面]# echo $NAME2        
1314
[root@localhost 桌面]# read -p "请输入一个整数:" NAME2
请输入一个整数:2
[root@localhost 桌面]# echo $NAME2
2

如果需要删除当前系统中设置的变量,可以通过unset命令删除。如下例:

[root@localhost 桌面]# set                                   //查看当前系统中设置的所有变量的值
[root@localhost 桌面]# unset NAME2

使用 NAME=[value] 的形式定义的变量默认在当前的shell中有效,子进程不会继承这样的变量,使用export命令会将变量放入环境中,这样新的进程会从父进程那里继承环境,export可以直接定义环境环境变量并赋值。如下例:

[root@localhost 桌面]# TEST=pass
[root@localhost 桌面]# echo $TEST
pass
[root@localhost 桌面]# bash                           //在当前shell下开启新进程bash       
[root@localhost 桌面]# echo $TEST                     //查看变量为空

[root@localhost 桌面]# exit                           //退出新进程
exit
[root@localhost 桌面]# export TEST                    //将已有的自定义变量添加至环境
[root@localhost 桌面]# bash                           //再次开启新进程
[root@localhost 桌面]# echo $TEST                     //查看变量值pass
pass

2.环境变量
Bash预设了很多环境变量,我们可以直接调用这些变量,下表列出了比较常用的变量名称及含义。详细参考Bash手册。

变量名称 含义
BASHPID 当前bash进程的进程号
GROUPS 当前用户所属组的组ID号
HOSTNAME 当前主机的主机名称
PWD 当前工作目录
OLDPWD 前一个工作目录
RANDOM 0~32767之间的随机数
UID 当前用户的ID号码
HISTSIZE 命令历史的记录条数
HOME 当前用户的家目录
PATH 命令搜索路径
PS1 主命令提示符
PS2 次命令提示符

以上变量中,有些是可以设置的,有些是只读而不可设置的。如果在Linux系统中输入ls命令,那么系统是怎么知道ls命令存放在哪里的,其实,Linux系统是通过PATH变量来搜索命令的。如下例:

[root@localhost ~]# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin
[root@localhost ~]# ls
anaconda-ks.cfg       公共  视频  文档  音乐
initial-setup-ks.cfg  模板  图片  下载  桌面

以上说明,在命令行输入ls命令后,系统就开始在/usr/local/bin/目录下开始查找这个命令。若找到则执行该命令,没有找到就继续查找下一个目录,如果搜索到最后的目录都没有找到ls命令,则提示命令没有找到。

注意:对于PATH路径的修改不可以直接对其赋新值,否则将覆盖PATH现有的值。

下面将PATH直接赋值给/root目录,然后再执行ls命令将提示命令未找到,因为系统只会在/root目录下查找有没有ls命令。

[root@localhost ~]# PATH=/root
[root@localhost ~]# ls
bash: ls: 未找到命令...

以上操作没有通过写入文件的方式把修改永久保存至环境变量,所以只要退出终端从新登陆终端PATH变量即可复原。那么对于PATH变量正确的修改方法是在原来的基础上修改,所以在赋值时需要引用旧值。

[root@localhost ~]# PAEH=$PATH:/root                             //在原有的路径列表后追加目录

3.位置变量
位置变量一般体现在脚本中,位置变量使得在脚本中的命令可以调用运行脚本时不同位置的参数,参数一般使用空格分隔。

$0代表当前shell程序的文件名称;
$1代表运行shell程序时第一个参数, $2为第二个参数,依此类推(范围为 $1~ $9);
$#代表shell程序所有参数的个数;
$*与 $@均代表所有参数的内容,区别是 $ *将所有的参数作为一个整体,而 $@将所有的参数分别作为个体看待;
$$表示当前进程的ID号;
$?表示程序的退出代码(一般0代表命令执行成功,非0代表命令执行失败)

下面通过编写一个脚本并运行它来查看效果:

[root@localhost 桌面]# vim /tmp/test.sh                     //编写脚本内容如下
#! /bin/bash
#This is test script for parameter!
echo "This is the file name: $0"
echo "This is first parameter: $1"
echo "This is second parameter: $2"
echo "This is the number of all paramter: $#"
echo "This is the all parameter: $*"
echo "This is the all parameter: $@"
echo "This is PID: $$"

[root@localhost 桌面]# bash /tmp/test.sh a b c               //允许脚本使用三个参数
This is the file name: /tmp/test.sh                          //这个程序的文件名是/tmp/test.sh
This is first parameter: a                                   //结果显示第一个参数为a
This is second parameter: b                                  //结果显示第二个参数为b
This is the number of all paramter: 3                        //结果显示所有参数的个数为3
This is the all parameter: a b c                             //所有参数的内容为‘a b c’
This is the all parameter: a b c                             //所有参数的内容为‘a’ ‘b’ ‘c’
This is PID: 46750                                           //当前进程的PID为2666

猜你喜欢

转载自blog.csdn.net/gao_2109/article/details/93306249