【Shell】Shell变量及相关操作
目录
变量(variable),顾名思义,是指在程序执行过程中其值可以改变的量。变量是计算机内存中被命名的存储位置,其中存放数字或字符串等数据,本篇将对Linux环境下Shell变量做个总结。
1 实验环境
- Oracle Linux 6.7
2 Shell变量类型
Shell中的变量分为环境变量、位置变量、预定义的特殊变量以及用户自定义变量,每种变量都有其特殊的功能。
2.1 Shell环境变量
Shell环境变量是一类Shell预定义变量,用于设置系统运行环境的变量,由系统统一命名,部分环境变量的值由系统设定,部分可由用户设定。
环境变量的名称由大写字母组成,常用的Shell环境变量如下:
1)HOME:用户主目录,一般为/home/用户名。不带参数的cd默认进入HOME指定的目录,即cd与 cd $HOME等价。
[oracle@strong ~]$ echo $HOME
/home/oracle
[oracle@strong ~]$ cd /u01/
[oracle@strong u01]$ pwd
/u01
[oracle@strong u01]$ cd $HOME
[oracle@strong ~]$ pwd
/home/oracle
2)PATH:定义了一些目录路径,路径由冒号分隔,在执行命令或Shell脚本时,Shell会按PATH变量中设定的顺序搜索这些目录,找到的第一个匹配的命令或Shell脚本将被执行。
[oracle@strong ~]$ echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/oracle/bin:/u01/app/oracle/product/12.1.0/dbhome_1/bin
3)TERM:终端类型。
[oracle@strong ~]$ echo $TERM
xterm
4)PWD:当前工作目录的绝对路径,该变量的取值随cd的使用而改变。
[oracle@strong ~]$ echo $PWD
/home/oracle
5)PS1:主提示符,对于根用户,默认为#,普通用户为$,可以对该值进行设置。
[oracle@strong ~]$ echo $PS1
[\u@\h \W]\$
6)PS2:辅助提示符,在Shell接收用户输入命令过程中,如果用户在输入行的末尾输入\然后回车,或shell判断用户虽然按回车键,但输入命令未结束时,将显示辅助提示符,默认为>。
[oracle@strong ~]$ echo $PS2
>
[oracle@strong ~]$ echo 'Hello,
> world'
Hello,
world
7)SHELL:定义shell的解释路径。
[oracle@strong ~]$ echo $SHELL
/bin/bash
8)MAIL:定义系统邮箱路径。
[oracle@strong ~]$ echo $MAIL
/var/spool/mail/oracle
9)LOGNAME:登录的用户名。
[oracle@strong ~]$ echo $LOGNAME
oracle
10)UID:当前用户的UID。
[oracle@strong ~]$ echo $UID
500
2.2 位置变量
位置变量是依据出现在命令行上参数的位置来确定的变量,在调用shell程序的命令中,参数的位置定义如下:
$命令 参数1 参数2 参数3 ...
当shell解释一个命令时,会将位置与命令行中的每一个参数关联,依次是:
- $0:对应当前执行的命令名(或shell程序的文件名);
- $1:对应第1个位置参数;
- $2:对应第2个位置参数;
- $3:对应第3个位置参数;
- .......
- $9:对应第9个位置参数。
当命令行的参数超过9个时,需要使用shift命令移动位置参数,每执行一次shift命令,变量0不变,从1开始位置参数左移一位。
[oracle@strong ~]$ cat test
#!/bin/bash
echo "--------------循环开始---------------"
while [ $# -gt 0 ]
do
echo "当前的位置参数为:$*"
shift
done
echo "------------循环结束----------------"
[oracle@strong ~]$ chmod u+x test
[oracle@strong ~]$ ./test 11 22 33 44 55 66 77
--------------循环开始---------------
当前的位置参数为:11 22 33 44 55 66 77
当前的位置参数为:22 33 44 55 66 77
当前的位置参数为:33 44 55 66 77
当前的位置参数为:44 55 66 77
当前的位置参数为:55 66 77
当前的位置参数为:66 77
当前的位置参数为:77
------------循环结束----------------
2.3 预定义特殊变量
预定义的特殊变量和环境变量类似,由shell根据实际情况来设置,所不同的是,该类变量具有特殊含义,不能由用户重新设置,所有的预定义特殊变量都有$符号与另一个符合组成,常用的如下:
- $#:实际位置参数个数;
- $*:命令行中的所有位置参数组成的字符串;
- $!:上一个后台命令对应的进程号;
- $?:表示最近一条命令执行后的退出状态,一般命令执行成功返回0;
- $$:当前进程PID;
示例1:
[oracle@strong ~]$ cat para
echo "参数个数:$#"
echo "参数:$*"
echo "前三个参数:$1,$2,$3"
echo "第四个参数:$4"
[oracle@strong ~]$ sh para A B C D
参数个数:4
参数:A B C D
前三个参数:A,B,C
第四个参数:D
示例2:
[oracle@strong ~]$ cat para_test
#!/bin/bash
if [ $# -eq 1 ]
then
DIR=$1
FILE=`basename $0`
DIR2=`basename $1`
if [ -x $DIR ]
then
tar zcvf ${FILE}${DIR2}.tar.gz $DIR
else
echo "$DIR is not exits."
fi
else
echo "Please ecter an argu."
fi
2.4 用户自定义的变量
用户可以根据需要自定义变量,变量区分大小写,建议所有的变量名用大写字母表示。
3 变量的操作
shell变量的基本操作包含变量的创建、删除等。
3.1 创建和设置变量
有两个内置命令可以创建变量,分别为declare和typeset,除了上述方式之外,还可以通过直接赋值给变量名进行变量的创建,为变量赋值时,变量名前不应加$,格式如下:
变量名=变量值
其中,等号前后不可有空格,变量的使用需要在变量名前加$。
示例:
[oracle@strong ~]$ NAME=alen
[oracle@strong ~]$ echo $NAME
alen
[oracle@strong ~]$
[oracle@strong ~]$ NAME="Hello,Alen"
[oracle@strong ~]$ echo $NAME
Hello,Alen
3.2 区分变量名
有时变量名会与其它字符一起使用,由此很容易混淆,例如:
[oracle@strong ~]$ order=10
[oracle@strong ~]$ echo "Tom is $orderth."
Tom is .
可以看到,输出结果部署Tome is 10th,而仅仅是Tome is 。因为shell会将orderth变量进行搜索,可以使用大括号来区别变量与其它字符,例如:
[oracle@strong ~]$ order=10
[oracle@strong ~]$ echo Tome is ${order}th.""
Tome is 10th.
3.3 删除变量
删除变量使用unset,如果变量未被设置成只读,则用户自定义变量和环境变量都可以通过unset进行删除。
[oracle@strong ~]$ echo $order
10
[oracle@strong ~]$ unset order
[oracle@strong ~]$ echo $order
[oracle@strong ~]$
3.4 变量赋值
shell中变量值的输入有多种方法,如直接赋值、通过read赋值、使用命令行参数赋值和利用命令的输出结果赋值等。
3.4.1 直接给变量赋值
shell中,在定义变量的同时可以直接给变量赋值,为变量赋值,变量名前不加$,且等号前后不可有空格。
[oracle@strong ~]$ cat resum
#!/bin/bash
NAME=Alen
GENDER=male
AGE=30
TEL=0755
echo "---------Resum-----------"
echo "name:${NAME}"
echo "age:${AGE}"
echo "gender:$GENDER"
echo "tel:$TEL"
echo "-------------------------"
[oracle@strong ~]$ chmod u+x resum
[oracle@strong ~]$ ./resum
---------Resum-----------
name:Alen
age:30
gender:male
tel:0755
-------------------------
3.4.2 使用read命令赋值
read是一个内置命令,可以从标准输入设备或从一个文件读取数据,read读取一个输入行直到遇到一个换行符为止,当读取时,行末尾的换行符被转换为一个空字符,read命令语法格式:
read 变量1 变量2......
[oracle@strong ~]$ cat read
#!/bin/bash
echo -n "请输入你的名字:"
read user
echo "您输入的名字为:${user}"
[oracle@strong ~]$ chmod u+x read
[oracle@strong ~]$ ./read
请输入你的名字:Alen
您输入的名字为:Alen
3.4.3 命令行参数赋值
shell提供了位置变量,因此用户可以通过使用命令行参数对位置变量赋值。
[oracle@strong ~]$ sh para AA BB CC DD
参数个数:4
参数:AA BB CC DD
前三个参数:AA,BB,CC
第四个参数:DD
3.4.4 命令的输出结果赋值
shell程序中,可以将一个可执行命令的执行结果赋值给一个变量,需要使用反引号``。
[oracle@strong ~]$ cat date
#!/bin/bash
date=`date +'%F %T'`
echo "当前时间是:$date"
[oracle@strong ~]$ chmod u+x date
[oracle@strong ~]$ ./date
当前时间是:2019-11-17 19:15:00
3.4.5 文件读入数据实现赋值
shell中,也可以从一个指定的文件读入数据并赋值给变量,为了方便处理数据,通常通过while循环一行行读入数据,即每循环一次将文件中的一行读入变量,直到读取到文件的结尾。
[oracle@strong ~]$ cat readfile
#!/bin/bash
ls -l > file
while read LINE
do
echo $LINE
done<file
[oracle@strong ~]$ ./readfile
3.5 变量的输出
输出变量最简单的方法是使用echo命令,此外,可以使用printf命令实现格式化输出,其作用是打印输出格式化字符串。