shell变量的分类及定义

shell变量的类型:

shell变量分环境变量(全局变量)和普通变量(局部变量)

环境变量亦称为全局变量,可以在建立它们的shell及其派生出来的任意子进程shell中使用;环境变量又分为自定义环境变量和Bash内置的环境变量。

普通变量亦称为局部变量,只能在创建它们的shell函数或shell脚本中使用,一般由开发者用户创建。

环境变量的作用:一般用于定义shell的运行环境,保证shell命令的正确执行,Shell通过环境变量来确定登陆用户名,命令路径,终端类型,登陆目的等。

环境变量的创建:可以在命令行中设置创建,但用户退出命令行时这些变量值就会丢失,因此,若希望永久保存环境变量,可在用户家目录下的 .bash_profile 或者 .bashrc 文件中或全局配置 /etc/bashrc 或 /etc/profile 文件或 /etc/profile.d/ 中定义。将环境变量放在这些文件中,每次用户登陆时这些变量值都会被初始化一次。

一般,环境变量都为大写,使用export命令导出定义环境变量

内置的环境变量,如HOME, PATH, SHELL, UID,USER,HOSTNAME 等,都是在用户登陆之前就已经被/bin/login程序设置好了。

自定义的环境变量: 如果想要设置环境变量,就要在给变量赋值之后或设置变量时使用export命令。带-x选项的declare内置命令也可以完成同样的功能。(注意:输出变量时不要在变量名前加$)

自定义环境变量的设置方法:
<1> export 变量名=value

[root@localhost SHELL]# export NAME=nihao
[root@localhost SHELL]# env | grep NAME
HOSTNAME=localhost.localdomain
NAME=nihao    //设置成功,但是此种方式不能永久生效
USERNAME=root
LOGNAME=root
[root@localhost SHELL]# 

要想让其生效必须将其放在用户的环境变量( .bashrc.bash_profile )或者全局的环境变量( /etc/profile 或 /etc/bashrc 或 /etc/profile.d )

<2> 变量名=value : export 变量名

<3> declare -x 变量名=value (很少用)

对环境变量的操作:

<1>用echo或者printf打印环境变量(注意:输出环境变量时,要加$符号)

[root@localhost SHELL]# echo $USER
root
[root@localhost SHELL]# printf $HOME
/root[root@localhost SHELL]# printf "$HOME\n"
/root
[root@localhost SHELL]# 

$HOME  用户登陆时进入的目录
$UID   当前用户的UID(用户标识)相当于 id-u
$PWD   当前工作目录的绝对路径名
$SEHLL  当前shell
$USER   当前用户

<2>用env(printenv) 或者set显示环境变量
一般不用set,set的显示比较乱

[root@localhost SHELL]# env
XDG_VTNR=1
XDG_SESSION_ID=1
DBUS_STARTER_ADDRESS=unix:abstract=/tmp/dbus-MQJKrUWfi8,guid=5a9152fe944f715e8f75d17d5868e73d
GPG_AGENT_INFO=/run/user/0/keyring-LQZGWn/gpg:0:1
VTE_VERSION=3406
XDG_MENU_PREFIX=gnome-
SHELL=/bin/bash
TERM=xterm-256color
WINDOWID=33554438
GNOME_KEYRING_CONTROL=/run/user/0/keyring-LQZGWn
QT_GRAPHICSSYSTEM_CHECKED=1
USER=root

<3>用unset消除本地变量或环境变量(unset 时不用加$符号)

[root@localhost SHELL]# export NAME=MMMMM    //设置环境变量
[root@localhost SHELL]# env | grep NAME      //查找环境变量NAME
NAME=MMMMM
USERNAME=root
LOGNAME=root
[root@localhost SHELL]# unset NAME          //删除环境变量
[root@localhost SHELL]# echo $NAME          //打印环境变量,没有输出,说明删除环境变量成功

[root@localhost SHELL]# 

普通变量的定义:

变量名=value

直接定义变量内容的方法;输出变量内容时会将变量内容里的变量或命令(要反引下)解析之后再输出,一般为简单连续的数字,字符串,路径名等,如果内容中有空格等特殊字符,则不能完整输出,需要改加双引号

[root@localhost SHELL]# d=123456
[root@localhost SHELL]# c="192.168.1.2-$d"
[root@localhost SHELL]# c=192.168.1.2-$d
[root@localhost SHELL]# echo $c
192.168.1.2-123456
[root@localhost SHELL]# 

//变量内容中有命令要反引下 反引符号为 ``
[root@localhost SHELL]# d=123456
[root@localhost SHELL]# c="192.168.1.2-$d"
[root@localhost SHELL]# c=192.168.1.2-$d
[root@localhost SHELL]# echo $c
192.168.1.2-123456
[root@localhost SHELL]# c=192.168.1.2-$`echo $d`
[root@localhost SHELL]# echo $c
192.168.1.2-$123456
[root@localhost SHELL]#

变量名=’value’

通过单引号定义变量;输出变量内容时单引号里面是什么就输出什么,即使内容中有变量和命令也会将它们原样输出。

变量名=”value”

通过双引号定义变量,输出变量时引号里的变量及命令(要反引下)会经过解析后才输出该变量的内容,而不是将引号中的变量或命令原样输出。

shell中变量名及变量内容的要求:

变量名 一般是由字母,数字,下划线组成。一般以字母或下划线开头,但是数字不可以。

变量名的输出:

$变量名表示变量输出,使用$变量名 或者 ${变量名} 是等同的。

[root@localhost SHELL]# a=192.168.1.2
[root@localhost SHELL]# echo $a
192.168.1.2
[root@localhost SHELL]# b='192.168.1.2'
[root@localhost SHELL]# echo $b
192.168.1.2
[root@localhost SHELL]# c="192.168.1.2"
[root@localhost SHELL]# echo $c
192.168.1.2
[root@localhost SHELL]# echo "a=$a"
a=192.168.1.2
[root@localhost SHELL]# echo "b=$b"
b=192.168.1.2
[root@localhost SHELL]# echo "c=${c}"
c=192.168.1.2
[root@localhost SHELL]# export NAME=MMMMM
[root@localhost SHELL]# echo "${NAME}"
MMMMM
[root@localhost SHELL]# 

连续普通字符串赋值给变量,不管是否使用了引号(单引号或双引号),内容是什么,就会打印出什么

但是当不是连续的普通字符串时:
[root@localhost SHELL]# a=192.168.1.2-$a
[root@localhost SHELL]# echo "a=$a"
a=192.168.1.2-192.168.1.2
[root@localhost SHELL]# b='192.168.1.2-$a'
[root@localhost SHELL]# echo "b=$b"
b=192.168.1.2-$a
[root@localhost SHELL]# c="192.168.1.2-$a"
[root@localhost SHELL]# echo "c=${c}"
c=192.168.1.2-192.168.1.2-192.168.1.2
[root@localhost SHELL]# echo "c=$c"
c=192.168.1.2-192.168.1.2-192.168.1.2
[root@localhost SHELL]# 

把命令的结果作为变量内容的定义方法

变量名=命令 //命令用反引号包裹
变量名=$(命令)

[root@localhost SHELL]# ddddd=`ls`
[root@localhost SHELL]# echo $ddddd
test1.sh test.sh UNIX.shell范例精解(第4版).pdf
[root@localhost SHELL]# ls
test1.sh  test.sh  UNIX.shell范例精解(第4版).pdf
[root@localhost SHELL]# e=$(ls)
[root@localhost SHELL]# echo $e
test1.sh test.sh UNIX.shell范例精解(第4版).pdf
[root@localhost SHELL]# 

你可能感兴趣的:(shell)