【Shell】Shell变量及相关操作

目录

1 实验环境

2 Shell变量类型

2.1 Shell环境变量

2.3 预定义特殊变量

2.4 用户自定义的变量

3 变量的操作

3.1 创建和设置变量

3.2 区分变量名

3.3 删除变量

3.4 变量赋值

3.4.1 直接给变量赋值

3.4.2 使用read命令赋值

3.4.3 命令行参数赋值

3.4.4 命令的输出结果赋值

3.4.5 文件读入数据实现赋值

3.5 变量的输出


变量(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命令实现格式化输出,其作用是打印输出格式化字符串。

posted @ 2019-11-17 20:55  追梦男生  阅读(303)  评论(0编辑  收藏  举报