Shell变量
Linux下包含各种变量, 本地变量、全局变量、标准变量
1、本地变量
通过set来查看设置了哪些本地变量。 当退出时,该变量自动消失;Shell的变量区分大小写
eg:
[root@oracle11g ~]# LOCALTEST="abc"
[root@oracle11g ~]# echo $Localtest
[root@oracle11g ~]# echo $LOCALTEST
abc
[root@oracle11g ~]# echo ${LOCALTEST}
abc
[root@oracle11g ~]# echo $Localtest
[root@oracle11g ~]# echo $LOCALTEST
abc
[root@oracle11g ~]# echo ${LOCALTEST}
abc
设置只读之后,不能改变
[root@oracle11g ~]# readonly LOCALTEST
[root@oracle11g ~]# LOCALTEST="china"
-bash: LOCALTEST: readonly variable
[root@oracle11g ~]# LOCALTEST="china"
-bash: LOCALTEST: readonly variable
查看只读属性
[root@oracle11g ~]# readonly
declare -ar BASH_VERSINFO='([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i686-redhat-linux-gnu")'
declare -ir EUID="0"
declare -r LOCALTEST="abc"
declare -ir PPID="15602"
declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor"
declare -ir UID="0"
declare -ar BASH_VERSINFO='([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i686-redhat-linux-gnu")'
declare -ir EUID="0"
declare -r LOCALTEST="abc"
declare -ir PPID="15602"
declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor"
declare -ir UID="0"
2、环境变量
它用于所有用户进程(经常称为子进程),登陆进程称为父进程。 不像本地变量,环境变量可用用于所有的子进程,包括编辑器、脚本和应用。
$HOME/.bash_profile(/etc/profile)中进行设置
export: export CAPITAL="beijing"。直接用export, 也可以查看到环境变量
env: 查看环境变量
同样可以设置只读属性
[root@oracle11g ~]# readonly CAPITAL
[root@oracle11g ~]# CAPITAL="shanghai"
-bash: CAPITAL: readonly variable
[root@oracle11g ~]# CAPITAL="shanghai"
-bash: CAPITAL: readonly variable
3、变量替换
echo ${变量名} / echo $变量名
${变量名:+value}:如果设置了变量名,则显示其值为value;否则,则为空
[root@oracle11g ~]# testvar="just a test"
[root@oracle11g ~]# echo $testvar
just a test
[root@oracle11g ~]# echo ${testvar}
just a test
[root@oracle11g ~]# echo ${testvar :+"ALIBABA"}
ALIBABA
[root@oracle11g ~]# echo ${ testvar1:+"ALIBABA"} //变量不存在显示空
[root@oracle11g ~]#
[root@oracle11g ~]# echo $testvar
just a test
[root@oracle11g ~]# echo ${testvar}
just a test
[root@oracle11g ~]# echo ${testvar :+"ALIBABA"}
ALIBABA
[root@oracle11g ~]# echo ${ testvar1:+"ALIBABA"} //变量不存在显示空
[root@oracle11g ~]#
${变量名:?value}:未设置变量,则显示错误信息value
[root@oracle11g ~]# echo ${testvar1
:?"no define"}
-bash: testvar1: no define
[root@oracle11g ~]# echo ${ testvar:?"no define"}
just a test
-bash: testvar1: no define
[root@oracle11g ~]# echo ${ testvar:?"no define"}
just a test
${变量名:-value}: 如果未设置变量名,则显示其值value;设置了,则显示设置了的值
[root@oracle11g ~]# echo ${testvar
:-"no define"}
just a test
[root@oracle11g ~]# echo ${ testvar1:-"no define"}
no define
just a test
[root@oracle11g ~]# echo ${ testvar1:-"no define"}
no define
${变量名:=value}: 如果未设置其值,则设置并显示其值
[root@oracle11g ~]# echo ${testvar1:="no define"}
no define
[root@oracle11g ~]# echo ${testvar1}
no define
no define
[root@oracle11g ~]# echo ${testvar1}
no define
4、清除变量
用unset, 但readonly的是取消不掉的
5、位置变量
位置一般用到9个, 分别为$0,$1...$9,需要传递更多的位置变量,需要使用其他办法
$0
|
$1
|
$2
|
$3
|
$4
|
$5
|
$6
|
$7
|
$8
|
$9
|
脚本名字
|
A
|
B
|
C
|
D
|
E
|
F
|
|
|
|
向脚本中使用位置参数
#!/bin/bash
#param
echo "脚本名字: $0"
echo "脚本第1个参数:$1"
echo "脚本第2个参数:$2"
echo "脚本第3个参数:$3"
echo "脚本第4个参数:$4"
echo "脚本第5个参数:$5"
echo "脚本第6个参数:$6"
echo "脚本第7个参数:$7"
echo "脚本第8个参数:$8"
echo "脚本第9个参数:$9"
echo "脚本第10个参数:$10"
#param
echo "脚本名字: $0"
echo "脚本第1个参数:$1"
echo "脚本第2个参数:$2"
echo "脚本第3个参数:$3"
echo "脚本第4个参数:$4"
echo "脚本第5个参数:$5"
echo "脚本第6个参数:$6"
echo "脚本第7个参数:$7"
echo "脚本第8个参数:$8"
echo "脚本第9个参数:$9"
echo "脚本第10个参数:$10"
执行脚本
[root@oracle11g ~]# ./abc.txt a b c d e f g h i j k
脚本名字: ./abc.txt
脚本第1个参数:a
脚本第2个参数:b
脚本第3个参数:c
脚本第4个参数:d
脚本第5个参数:e
脚本第6个参数:f
脚本第7个参数:g
脚本第8个参数:h
脚本第9个参数:i
脚本第10个参数:a0
脚本名字: ./abc.txt
脚本第1个参数:a
脚本第2个参数:b
脚本第3个参数:c
脚本第4个参数:d
脚本第5个参数:e
脚本第6个参数:f
脚本第7个参数:g
脚本第8个参数:h
脚本第9个参数:i
脚本第10个参数:a0
[root@oracle11g ~]# ./abc.txt a b c d e f g
脚本名字: ./abc.txt
脚本第1个参数:a
脚本第2个参数:b
脚本第3个参数:c
脚本第4个参数:d
脚本第5个参数:e
脚本第6个参数:f
脚本第7个参数:g
脚本第8个参数:
脚本第9个参数:
脚本第10个参数:a0
脚本名字: ./abc.txt
脚本第1个参数:a
脚本第2个参数:b
脚本第3个参数:c
脚本第4个参数:d
脚本第5个参数:e
脚本第6个参数:f
脚本第7个参数:g
脚本第8个参数:
脚本第9个参数:
脚本第10个参数:a0
查看某目录下是否含有某个文件
#!/bin/bash
#find.sh
find /root -name $1 -print
#find.sh
find /root -name $1 -print
[root@oracle11g ~]# ./find.sh test
/root/Desktop/test
/root/Desktop/test
6、标准变量
bash默认建立了一些标准环境变量,可在/etc/profile中定义。包含
EXINIT:VI启动前的使用的初始化变量
HOME:主目录, echo $HOME可以查看
IFS:linux下域的分割,比如ls出来个文件名之间用tab分割,PATH路径中各变量使用':'分割等 echo $IFS
LOGNAME:登录名
MAIL:邮箱位置
MAILCHECK:每隔多少秒去检查是否有新邮件进入
TERM:终端类型
[root@oracle11g ~]# echo $TERM
vt100
vt100
TZ:时区
PS1:终端显示字符, 在bashrc或.bash_profile中加入:
export PS1="[\u@\h \W]\\$ "
[root@oracle11g Desktop]# echo $PS1
[\u@\h \W]\$
[\u@\h \W]\$
[root@oracle11g Desktop]# set | grep "PS"
GROUPS=()
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
GROUPS=()
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
SHELL:
MANPATH:帮助文档存放的位置在哪
TERMINFO:终端的信息
7、特殊变量
$#:参数个数
echo "参数个数:" $#
[root@oracle11g ~]# ./abc.txt a b c d
脚本名字: ./abc.txt
脚本第1个参数:a
脚本第2个参数:b
脚本第3个参数:c
脚本第4个参数:d
脚本第5个参数:
参数个数: 4
脚本名字: ./abc.txt
脚本第1个参数:a
脚本第2个参数:b
脚本第3个参数:c
脚本第4个参数:d
脚本第5个参数:
参数个数: 4
$*:以一个字符串显示所有项脚本传递的参数,与位置变量不同,此变量可以超过9个
$$:脚本运行的当前进程ID号
$!:后台运行的最后一个进程的进程ID号
$@:与$#相同,但是使用时加引号,并在引号中返回每个参数
$-:显示shell使用的当前选项,与set命令功能相同
$?:显示最后命令的推出状态. 0表示没有错误,其他表示有错误
8、影响变量的命令
declare:设置或显示变量
-f:只显示函数名
-r:创建只读变量
-x:创建转出变量
-i:创建整数变量
export:用于创建传给子shell的变量
--:
-f:
-n:
-p:
readonly
--:
-f:
set
shift[n]:用于移动变量位置,调整位置变量,使$3赋给$2, $2复制给$1
#!/bin/bash
#param
echo "脚本名字: $0"
echo "脚本第1个参数:$1"
echo "脚本第2个参数:$2"
echo "脚本第3个参数:$3"
echo "脚本第4个参数:$4"
echo "参数个数:" $#
shift 2
echo "shift后脚本第1个参数:$1"
echo "shift后脚本第2个参数:$2"
#param
echo "脚本名字: $0"
echo "脚本第1个参数:$1"
echo "脚本第2个参数:$2"
echo "脚本第3个参数:$3"
echo "脚本第4个参数:$4"
echo "参数个数:" $#
shift 2
echo "shift后脚本第1个参数:$1"
echo "shift后脚本第2个参数:$2"
执行脚本:
[root@oracle11g ~]# ./abc.txt a b c d
脚本名字: ./abc.txt
脚本第1个参数:a
脚本第2个参数:b
脚本第3个参数:c
脚本第4个参数:d
参数个数: 4
shift后脚本第1个参数:c
shift后脚本第2个参数:d
脚本名字: ./abc.txt
脚本第1个参数:a
脚本第2个参数:b
脚本第3个参数:c
脚本第4个参数:d
参数个数: 4
shift后脚本第1个参数:c
shift后脚本第2个参数:d
typeset:用于显示或设置变量,与declare同义词
unset:取消变量的定义
--:表名选项结束
-f:删除只读变量,但不能取消从shell环境中删除指定的变量和函数。如PATH,PS1,PS2,PPID,UID,EUID的设置等。