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]#