Shell中的变量

注意:与其他编程语言不同,Bash中的变量没有数据类型的区别。变量中的值都是以字符串的形式保存的,如果要进行数值计算,需要进行特殊转换。

Linux Shell下的变量按其使用目的可以分为3中类型。

环境变量:用于保存操作系统运行时使用的环境变量。

位置变量:Bash将传递给脚本的参数保存在位置变量中,以便于在脚本中引用这些参数。

预定义变量:由系统保留和维护的一组特殊的变量,这些变量通常用于保存程序运行状态等。

自定义变量:由用户自行定义的变量。

一、保存系统运行情况的环境变量

系统环境变量是用户登录系统时,由系统自动生成并设置的一组变量。所有的进程、脚本都可以引用这些变量,因此环境变量的值通常与系统息息相关。

系统启动后会产生许多环境变量,用户可以使用set命令查看这些环境变量:

[root@localhost shell]# set
BASH=/bin/bash
BASH_ARGC=()
BASH_ARGV=()
BASH_LINENO=()
BASH_SOURCE=()

上面的命令输出了系统中使用的变量及其值,其中大多数都是环境变量。有时也存在一些用户自定义的变量等。

1、系统中常见的环境变量

(1)家目录位置变量HOME

HOME变量用于保存当前登录用户的家目录位置,这个变量的值是由系统用户文件/etc/passwd中的用户家目录字段定义的。查看当前用户家目录:

[root@localhost shell]# echo $HOME
/root

(2)系统语言变量LANG

LANG变量用于保存系统当前使用的语言,如果要临时修改当前系统使用的语言,通常可以通过修改该变量的值来实现。查看当前系统使用的语言:

#en_US.UTF-8表示英语
[root@localhost shell]# echo $LANG
en_US.UTF-8

#zh_CN.UTF-8表示简体中文
[root@localhost shell]# LANG=zh_CN.UTF-8
[root@localhost shell]# echo $LANG
zh_CN.UTF-8

这时当前终端用户(本例中为root)使用的语言将会变为简体中文。

(3)交互程序变量SHELL

SHELL变量用于保存用户当前使用的Shell。可以通过查看该变量值的方法,快速查看当前使用的Shell:

[root@localhost shell]# echo $SHELL
/bin/bash

(4)命令搜索路径变量PATH

PATH变量用于保存当前用户使用的命令搜索路径。当用户输入命令时,系统会尝试在该变量保存的目录中查找命令文件。

[root@localhost shell]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin:/usr/local/MPlayer/bin

关于PATH变量的应用请参看文章:编译安装的命令和工具。http://www.cnblogs.com/nufangrensheng/p/3474379.html

(5)主提示符变量PS1

变量PS1保存了用户使用的主提示符,该提示符通常都使用了一个字符串表达式。查看当前用户使用的主提示符:

[root@localhost shell]# echo $PS1
[u@h W]$

以上命令输出了当前用户的主提示符表达式,这个表达式的结果形如:[root@localhost ~]# 。

用户通过修改变量PS1的方式自定义主提示符,可以用于定义主提示符的表达式及其含义如下:

u:当前使用系统的用户。

h:当前计算机名。

W:当前工作路径。

d:当前系统日期。

$:提示符,root用户是井号“#”,普通用户是美元符号“$”.

H:完整的计算机名称。

:24小时制的时间格式。

v:当前Bash的版本。

例如修改当前用户的提示符:

[root@localhost ~]# PS1='[d H 	 v]$'
[Mon Dec 16 localhost.localdomain 09:58:27 3.1]#

(6)辅助提示符变量PS2

查看辅助提示符:

[root@localhost ~]#echo $PS2
>
[root@localhost ~]#echo 
> Hello
Hello

辅助提示符一般用于强制换行时,提示用户继续输入命令。

2、只读工作环境

查看系统中的只读环境变量:

[root@localhost ~]#readonly
declare -ar BASH_VERSINFO='([0]="3" [1]="1" [2]="17" [3]="1" [4]="release" [5]="i686-redhat-linux-gnu")'
declare -ir EUID="0"
declare -ir PPID="17340"
declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor"
declare -ir UID="0"

只读环境变量都是一些非常重要的变量。以UID变量为例:人们在编写的脚本中,通常使用此变量判断用户的身份(值为0则表示root用户)。如果普通用户能够修改这个变量的值,就可以冒充其他用户,这是非常不安全的。

3、修改环境变量

在命令提示符中修改的环境变量将在用户重新登录、系统重启后消失。这时可以在配置文件中修改环境变量。

在Linux系统中,用户环境变量的定义工作主要是在以下文件中完成的。

/etc/profile:全局用户配置文件。如果修改了此文件中的设置,修改的设置将会影响系统中的所有用户。

~/.bash_profile:用户个人配置文件。如果修改了此文件中的设置,修改的设置只会影响单个用户。

/etc/bashrc:全局环境变量配置文件。此文件中定义了所有用户的环境变量。

~/.bashrc:个人环境变量配置文件。此文件中定义了用户的环境变量。

由于全局用户配置文件和全局环境变量配置文件中的设置会影响所有用户,因此不推荐修改这两个文件。

二、传递参数的位置变量

Bash定义了9个位置变量,分别是$1、$2、$3、$4…$9.脚本编写者在脚本中引用这9个变量,获取传递给脚本的参数。

[root@localhost shell]# cat example.sh 
#!/bin/bash

#This is a test script.
#2013/12/16

echo '$1' "=" $1 '$2' "=" $2 '$3' "=" $3
echo '$4' "=" $4 '$5' "=" $5 '$6' "=" $6
echo '$7' "=" $7 '$8' "=" $8 '$9' "=" $9
[root@localhost shell]# ./example.sh 1 2 3 4 5 6 7 8 9
$1 = 1 $2 = 2 $3 = 3
$4 = 4 $5 = 5 $6 = 6
$7 = 7 $8 = 8 $9 = 9

使用位置变量时,需要注意位置变量只能获取9个参数。

三、系统预先定义的变量

系统预先定义的变量简称预定义变量,是由系统预先定义的一组变量,这些变量通常用于保存与系统、命令等有关的信息。预定义变量由系统自动生成、维护,用户无须修改其值。

常见的预定义变量及其含义如下:

$0:保存当前进程或脚本的名称。

$*:保存传递给脚本或进程的所有参数。

$$:当前进程或脚本的PID。

$!:后台运行的最后一个进程的PID号。

$?:用于返回上一条命令是否执行成功。如果成功执行,将返回数字0,否则返回非零数字(通常情况下都返回数字1)。

$#:用于保存脚本的参数个数。

(1)

[root@localhost shell]# cat example1.sh 
#!/bin/bash

#This is a test script.
#2013/12/16

echo "script name:"$0
echo "all parameters:"$*
echo "PID of the script:"$$
echo "success of the previous command:"$?
[root@localhost shell]# ./example1.sh one two three
script name:./example1.sh
all parameters:one two three
PID of the script:7425
success of the previous command:0

(2)

[root@localhost shell]# sleep 100 &
[1] 7439
[root@localhost shell]# sleep 300 &
[2] 7453
[root@localhost shell]# echo $!
7453

四、用户自定义变量

与其他编程语言类似,在Bash中也可以使用自定义变量,并且使用方法大同小异。唯一需要注意的是Bash中的变量没有数据类型(即任何变量都可以存放数字、字符串等)。

【自定义变量的命名规则】

  • 由于变量没有具体的数据类型,因此在定义变量时可以不必定义其类型,直接赋值即可使用。
  • 在Shell中变量名称可以由大写字母、小写字母、下划线、数字等符号组成。
  • 定义变量时,建议使用大写字母、下划线和数字组成变量名,以免引起不必要的误解。
  • 变量对大小写敏感。

【变量的作用域】

变量的作用域是指变量的引用范围,也可以理解为变量在哪个区域起作用。Bash中的变量作用域规则可以归纳为以下两点:

  • 除非使用了export命令,否则在脚本中定义的变量(包括函数中定义的变量)的作用域是整个脚本。
  • 使用export定义的变量都是全局变量。全局变量可以在当前用户的任何脚本、命令中引用。

从以上两点可以看出,如果用户需要在脚本中定义全局变量,必须使用export命令。

【用法示例】

(1)定义一个名为NAME的变量,并为其赋值为Jhon:

#直接为变量赋值即可声明变量
#变量的值可以不必放入引号内,除非值中含有特殊字符
[root@localhost shell]# NAME=Jhon

(2)如果用户需要经常使用一个变量,可以将这个变量定义为一个环境变量。例如要使用变量保存备份目录:

[root@localhost shell]# BACKUP_DIR=/file/backup
[root@localhost shell]# export BACKUP_DIR

(3)如果用户希望定义一个不能更改值的只读变量,可以先定义变量,然后使用readonly命令将变量转换为只读变量。

例如要定义一个变量PI:

[root@localhost shell]# PI=3.14
[root@localhost shell]# readonly PI
[root@localhost shell]# PI=3.1415
bash: PI: readonly variable

(4)使用变量时,无论是引用变量,还是变量间的运算,都应该使用变量引用符“$”:

[root@localhost shell]# NAME=Jhon
[root@localhost shell]# echo "Hello, $NAME"
Hello, Jhon
[root@localhost shell]# A=12
[root@localhost shell]# B=12
[root@localhost shell]# expr $A + $B
24

在上面的例子中,变量之间的数值运算使用了命令expr。这是因为Bash中的变量默认都是字符串类型的,只有将其转换后才能运算。

(5)用户自定义变量的使用方法之猜数游戏脚本文件:

[root@localhost shell]# cat example2.sh 
#!/bin/bash

#this is a example
#2013/12/16

RAN=`expr $RANDOM % 10`
RAN=`expr $RAN + 1`
echo "This is a guessing game."
echo "Number range:1-10"
while true
        do
        echo -n "Please enter the number you think:"
        read NUM
        if [ $NUM -lt 1 ] || [ 10 -lt $NUM ]
        then
                echo "You enter the number out of range."
                continue
        fi
        if [ $NUM = $RAN ]
        then
                echo "You guess it."
                unset NUM RAN
                exit 0
        fi
        if [ $NUM -lt $RAN ]
        then 
                echo "You enter the number is too samll."
        else
                echo "You enter the number is too large."
        fi
done
[root@localhost shell]# ./example2.sh 
This is a guessing game.
Number range:1-10
Please enter the number you think:5
You enter the number is too large.
Please enter the number you think:3
You enter the number is too large.
Please enter the number you think:2
You enter the number is too large.
Please enter the number you think:1
You guess it.

(6)当变量完成其作用不再使用时,应该将变量从系统中清除,以释放其占用的系统资源。

清除变量可以使用命令unset:

[root@localhost shell]# echo $NAME
Jhon
[root@localhost shell]# unset NAME
[root@localhost shell]# echo $NAME

[root@localhost shell]#

需要注意的是,使用unset命令清除变量时,不必使用变量引用符。

技巧:如果用户编写了数个脚本,并且需要使用许多变量,可以为这些变量编写单独的变量文件,或将变量设置为全局变量,需要使用时引用这些变量即可。这样既可以方便脚本编写,又方便维护变量。

原文地址:https://www.cnblogs.com/nufangrensheng/p/3477281.html