为使shell编程更有效,系统提供了一些shell变量。shell变量可以保存诸如路径名、文件名或者一个数字这样的变量名。shell将其中任何设置都看做文本字符串。

有两种变量,本地和环境。严格地说可以有4种,但其余两种是只读的,可以认为是特殊变量,它用于向shell脚本传递参数。

1 什么是shell变量

按照定义来说,变量是存储设备中的一些可读写的存储单元.变量可以定制用户本身的工作环境。使用变量可以保存有用信息,使系统获知用户相关设置。变量也用于保存暂时信息。例如:一变量为EDITOR,系统中有许多编辑工具,但哪一个适用于系统呢?将此编辑器名称赋给EDITOR,这样,在使用cron或其他需要编辑器的应用

时,这就是你将一直使用的EDITOR取值,并将之用作缺省编辑器。

举例来说,登录的审核系统需要编辑。在菜单中选择此选项时,应用查询EDITOR变量值,其值为vi。系统知道可使用此编辑器(用命令echo $EDITOR看看自己的?)。

另一个例子需要登录数据库系统,键入下列命令:

$ isql -Udavet -Pabcd -Smethsys

这里- S为正在连接的服务器名称。有一变量DSQUERY保存服务器名称值。设置服务器名称值到DSQUERY变量,这样如果登录时不使用-S提供服务器名称,应用将查询DSQUERY变量,并使用其取值作为服务器名称。需要做的全部工作就是键入下列命令:

$ isql -Udavet -Pabcd

工作方式同上例。

2 本地变量本地变量在用户现在的shell生命期的脚本中使用。例如,本地变量file-name取值为loop.doc,这个值只在用户当前shell生命期有意义。如果在shell中启动另一个进程或退出,此值将无效。这个方法的优点就是用户不能对其他的shell或进程设置此变量有效。

使用变量时,如果用花括号将之括起来,可以防止shell误解变量值,尽管不必一定要这样做,但这确实可用。要设置一本地变量,格式为:

$ variable-name=value 或 $ {variable-name=value}

注意,等号两边可以有空格。如果取值包含空格,必须用双引号括起来。shell变量可以用大小写字母。

变量设置时的不同模式:

Variable-name=value  设置实际值到variable-name

Variable-name+value  如果设置了variable-name,则重设其值

Variable-name:?value  如果未设置variable-name,显示未定义用户错误信息

Variable-name?value  如果未设置variable-name,显示系统错误信息

Variable-name:=value  如果未设置variable-name,设置其值

Variable-name:-value  同上,但是取值并不设置到variable-name,可以被替换

2.1 显示变量

使用echo命令可以显示单个变量取值,并在变量名前加$,例如:

echo $LOGNAME

$dave

可以结合使用变量,下面将错误信息和环境变量LOGNAME设置到变量error-msg。

$ERROR_MSG="sorry, there is not $LOGNAME"

$echo "$ERROR_MSG"

$sorry, there is not dave

上面例子中,shell首先显示文本,然后查找变量$LOGNAME,最后扩展变量以显示整个变量值。

2.2 清除变量使用unset命令清除变量。

unset variable-name

2.3 显示所有本地shell变量使用不加任何参数的set命令显示所有本地定义的shell变量。

set输出可能很长。查看输出时可以看出shell已经设置了一些用户变量以使工作环境更加容易使用。

2.4 结合变量值将变量并排可以使变量结合在一起:

echo $var_1$var_2

2.5 测试变量是否已经设置

有时要测试是否已设置或初始化变量。如果未设置或初始化,就可以使用另一值。此命令格式为:

$ {variable:-value}

意即如果设置了变量值,则使用它,如果未设置,则取新值。例如:

$color=blue

$echo "The sky is ${color:-grey} today"

The sky is blue today

变量colour取值blue,echo打印变量colour时,首先查看其是否已赋值,如果查到,则使用该值。现在清除该值,再来看看结果。

$color=blue

$unset color

$echo "The sky is ${color:-grey} today"

The sky is grey today

上面的例子并没有将实际值传给变量,需使用下述命令完成此功能:

$ {variable:=value}

2.6 使用变量来保存系统命令参数可以用变量保存系统命令参数的替换信息。下面的例子使用变量保存文件拷贝的文件名信息。变量source保存passwd文件的路径。

$ source="/etc/passwd"

$ cd $source

2.7 设置只读变量

如果设置变量时,不想再改变其值,可以将之设置为只读方式。如果有人包括用户本人想要改变它,则返回错误信息。格式如下:

variable-name=value

readonly variable-name

设为只读后,任何改变其值的操作将返回错误信息。要查看所有只读变量,使用命令readonly即可。

3 环境变量

环境变量用于所有用户进程(经常称为子进程)。登录进程称为父进程。s h e l l中执行的用户进程均称为子进程。不像本地变量(只用于现在的s h e l l)环境变量可用于所有子进程,这包括编辑器、脚本和应用。

环境变量可以在命令行中设置,但用户注销时这些值将丢失,因此最好在. profile文件中定义。系统管理员可能在/etc/profile文件中已经设置了一些环境变量。将之放入profile文件意味着每次登录时这些值都将被初始化。传统上,所有环境变量均为大写。环境变量应用于用户进程前,必须用export命令导出。环境变量与本地变量设置方式相同。

3.1 设置环境变量

VARIABLE-NAME=value;export VARIABLE-NAME

在两个命令之间是一个分号,也可以这样写:

VARIABLE-NAME=value

export VARIABLE-NAME

3.2 显示环境变量显示环境变量与显示本地变量一样,用echo命令即可。

使用env命令可以查看所有的环境变量。

3.3 清除环境变量

使用unset命令清除环境变量

unset VARIABLE-NAME

3.4 嵌入shell变量

Brourne shell 有一些预留的环境变量名,这些变量名不能用作其他用途。通常在/etc/profile中建立这些嵌入的环境变量,但也不完全是,这取决于用户自己。以下是嵌入shell变量列表。

1. CDPATH

改变目录路径变量,保留一系列由冒号隔开的路径名,用于cd命令。如果设置了CDPATH,cd一个目录时,首先查找CDPATH,如果CDPATH指明此目录,则此目录成为当前工作目录。例子如下:

$ CDPATH=:/home/dave/bin:/usr/local/apps ;export CDPATH.

如果要

$ cd apps

cd命令首先在CDPATH中查找目录列表,如果发现apps,则它成为当前工作目录。

2. EXINIT

EXINIT变量保存使用vi编辑器时的初始化选项。例如,调用vi时,要显示行号,且在第10个空格加入tab键,命令为:

$ EXINIT=‘set nu tab=10‘;export EXINIT

3. HOME

HOME目录,通常定位于passwd文件的倒数第2列,用于保存用户自身文件。设置了HOME目录,可以简单使用cd命令进入它。也可以用

$ cd $HOME

4. IFS

IFS用作shell指定的缺省域分隔符。原理上讲域分隔符可以是任意字符,但缺省通常为空格、新行或tab键。IFS在分隔文件或变量中各域时很有用。下面的例子将IFS设置为冒号,然后echo $PATH变量,给出一个目录分隔开来的可读性很强的路径列表。

/sbin /bin /usr/bin /home/dave/bin

要设置其返回初始设置:

$ IFS=; export IFS

这里为空格和tab键。

5. LOGNAME

此变量保存登录名,应该为缺省设置,但如果没有设置,可使用下面命令完成它:

$ LOGNAME=‘dave‘; export LOGNAME

6. MAIL

MAIL变量保存邮箱路径名,缺省为/var/spool/mail/。shell周期性检查新邮件,如果有了新邮件,在命令行会出现一个提示信息。如果邮箱并不在以上指定位置,可以用MAIL设置。

$ MAIL=/usr/mail/dave ;export MAIL

7. MAILCHECK

MAILCHECK缺省每60s检查新邮件,但如果不想如此频繁检查新邮件,比如设为每2m,使用命令:

$ MAILCHECK=120 ;export MAILCHECK

8. MAILPATH

如果有多个邮箱要用到MAILPATH,此变量设置将覆盖MAIL设置。

$ MAILPATH=/var/spool/dave:/var/spool/admin ;export MAILPATH

上面的例子中,MAIL检测邮箱dave和admin。

9. PATH

PATH变量保存进行命令或脚本查找的目录顺序,正确排列这个次序很重要,可以在执行命令时节省时间。你一定不想在已知命令不存在的目录下去查找它。通常情况,最好首先放在HOME目录下,接下来是从最常用到一般使用到不常用的目录列表次序。如果要在当前工作目录下查询,无论在哪儿,均可以使用句点操作。目录间用冒号分隔,例如:

$ PATH=$HOME/bin:.:/bin:/usr/bin ;export PATH

使用上面的例子首先查找HOME/bin目录,然后是当前工作目录,然后是/bin,最后是

/usr/bin。

PATH可以在系统目录下/etc/profile中设置,也可以使用下面方法加入自己的查找目录。

$PATH=$PATH:/$HOME/bin:.;export PATH

这里使用了/etc/profile中定义的PATH,并加入$HOME/bin和当前工作目录。一般来说,在查找路径开始使用当前工作目录不是一个好办法,这样很容易被其他用户发现。

10. PS1

基本提示符包含shell提示符,缺省对超级用户为#,其他为$。可以使用任何符号作提示符.

11. PS2

PS2为附属提示符,缺省为符号>。PS2用于执行多行命令或超过一行的一个命令。

12. SHELL

SHELL变量保存缺省shell,通常在/etc/passwd中已设置,但是如有必要使用另一个shell,

可以用如下方法覆盖当前shell:

13. TERMINFO

终端初始化变量保存终端配置文件的位置。通常在/usr/lib/terminfo或/usr/share/terminfo

$ TERMINFO=/usr/lib/terminfo ;export TERMINFO

14. TERM

TERM变量保存终端类型。设置TERM使应用获知终端对屏幕和键盘响应的控制序列类型,常用的有vt100、vt200、vt220-8等。

$ TERM=vt100 ;export TERM

15. TZ

时区变量保存时区值,只有系统管理员才可以更改此设置。例如:

$echo $TZ

GMT2EDT

返回值表明正在使用格林威治标准时间,与GMT时差为2,并作EDT保存。

3.5 其他环境变量还有一些预留的环境变量。其他系统或命令行应用将用到它们。以下是最常用的一些,注意这些值均未有缺省设置,必须显示说明。

1. EDITOR

设置编辑器,最常用。

$ EDITOR=vi ;export EDITOR

2. PWD

当前目录路径名,用cd命令设置此选项。

3. PAGER

保存屏幕翻页命令,如pg、more,在查看man文本时用到此功能。

$ PAGER=‘pg -f -p%d‘ ;export PAGER

4. MANPATH

保存系统上man文本的目录。目录间用冒号分隔。

$ MANPATH=/usr/apps/man:/usr/local/man ;export MANPATH

5. LPDEST或PRINTER

保存缺省打印机名,用于打印作业时指定打印机名。

$ LPDEST=hp3si-systems

3.6 set命令

在$HOME.profile文件中设置环境变量时,还有另一种方法导出这些变量。使用set命令- a选项,即set -a指明所有变量直接被导出。不要在/etc/profile中使用这种方法,最好只在自己的$HOME/.profile文件中使用。

3.7 将变量导出到子进程shell新用户碰到的问题之一是定义的变量如何导出到子进程。前面已经讨论过环境变量的工作方式,现在用脚本实现它,并在脚本中调用另一脚本(这实际上创建了一个子进程)。以下是两个脚本列表father和child。father脚本设置变量film,取值为AFewGoodMen,并将变量信息返回屏幕,然后调用脚本child,这段脚本显示第一个脚本里的变量film,然后改变其值为DieHard,再将其显示在屏幕上,最后控制返回father脚本,再次显示这个变量。

$more father

#!/bin/sh

#father script

echo "this is the father"

FILM="A Few Good Men"

echo "I like the film :$FILM"

#call the child script

./child

echo "back to father"

echo "and the film is :$FILM"

$more child

#!/bin/sh

#child script

echo "called from father..i am the child"

echo "film is :$FILM"

FILM="Die Hard"

echo "changing film to :$FILM"

看看脚本显示结果:

this is the father

I like the film :A Few Good Men

./child: line 1: child: command not found

called from father..i am the child

film is :

changing film to :Die Hard

back to father

and the film is :A Few Good Men

因为在father中并未导出变量film,因此child脚本不能将film变量返回。如果在father脚本中加入export命令,以便child脚本知道film变量的取值,这就会工作:

$more father2

#!/bin/sh

#father2 script

echo "this is the father"

FILM="A Few Good Men"

echo "I like the film :$FILM"

#call the child script

#but export varible first

export FILM

./child

echo "back to father"

echo "and the film is :$FILM"

$ ./father2

this is the father

I like the film :A Few Good Men

called from father..i am the child

film is :A Few Good Men

changing film to :Die Hard

back to father

and the film is :A Few Good Men

因为在脚本中加入了export命令,因此可以在任意多的脚本中使用变量film,它们均继承了film的所有权。

4 位置变量参数

本章开始提到有4种变量,本地、环境,还有两种变量被认为是特殊变量,因为它们是只读的。这两种变量即为位置变量和特定变量参数。先来看一看位置变量。

如果要向一个shell脚本传递信息,可以使用位置参数完成此功能。参数相关数目传入脚本,此数目可以任意多,但只有前9个可以被访问,使用shift命令可以改变这个限制(以后将讲到shift命令)。参数从第一个开始,在第9个结束;每个访问参数前要加$符号。第一个参数为0,表示预留保存实际脚本名字。无论脚本是否有参数,此值均可用。

如果向脚本传送Did You See Th e Full Moon信息,下面的表格讲解了如何访问每一个参数。

$0           $1   $2    $3    $4   $5    $6     $7  $8  $9

脚本名字   Did  You  See  The  Full  Moon

4.1 在脚本中使用位置参数

在下面脚本中使用上面的例子。

$more param

#!/bin/sh

#param

echo "This is the script name    : $0"

echo "This is the first parameter: $1"

echo "This is the 2nd parameter  : $2"

echo "This is the third parameter: $3"

echo "This is the 6th parameter  : $6"

echo "This is the 7th parameter  : $7"

$ ./param Did You See The Full Moon

This is the script name    : ./param

This is the first parameter: Did

This is the 2nd parameter  : You

This is the third parameter: See

This is the 6th parameter  : Moon

This is the 7th parameter  :

这里只传递6个参数,7、8、9参数为空,正像预计的那样。注意,第一个参数表示脚本名,当从脚本中处置错误信息时,此参数有很大作用。

注意$0返回当前目录路径,如果只返回脚本名,在basename命令下参数设为$0,刚好得到脚本名字。

$more param2

#!/bin/sh

echo "this is `basename $0`calling"

$./param2

this is param2 calling

4.2 向系统命令传递参数

可以在脚本中向系统命令传递参数。下面的例子中,在find命令里,使用$1参数指定查找文件名。

$more findfile

#!/bin/sh

#findfile

find / -name $1 -print

另一个例子中,以$1向grep传递一个用户id号,grep使用此id号在passwd中查找用户全名。

$more who_is

#!/bin/sh

#who_is

grep $1 passwd | awk -F: {print $4}

4.3 特定变量参数

既然已经知道了如何访问和使用shell脚本中的参数,多知道一点相关信息也是很有用的,有必要知道脚本运行时的一些相关控制信息,这就是特定变量的由来。共有7个特定变量:

$# 传递到脚本的参数个数

$* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个

$$ 脚本运行的当前进程ID号

$! 后台运行的最后一个进程的进程ID号

$@ 与$ #相同,但是使用时加引号,并在引号中返回每个参数

$- 显示shell使用的当前选项,与set命令功能相同

$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

特定变量的输出使用户获知更多的脚本相关信息。可以检查传递了多少参数,进程相应的ID号,以免我们想杀掉此进程。

4.4 最后的退出状态注意,$?返回0。可以在任何命令或脚本中返回此变量以获得返回信息。基于此信息,可以在脚本中做更进一步的研究,返回0意味着成功,1为出现错误。

下面的例子拷贝文件到/tmp,并使用$?检查结果。

$ cp ok.txt /tmp

$ echo $?

0

现在尝试将一个文件拷入一个不存在的目录:

$ cp ok.txt /usr/bin/aaa/bbb

cp: cannot create regular file ‘/usr/bin/aaa/bbb‘: No such file or directory

$ echo $?

1

使用$?检验返回状态,可知脚本有错误,但同时发现cp:cannot...,因此检验最后退出状态已没有必要。在脚本中可以用系统命令处理输出格式,要求命令输出不显示在屏幕上。为此可以将输出重定向到/dev/null,即系统bin中。现在怎样才能知道脚本正确与否?好,这时可以用最后退出状态命令了。请看上一个例子的此形式的实际操作结果。

$ cp ok.txt /usr/bin/aaa/bbb >/dev/null 2>&1

$ echo $?

1

通过将包含错误信息的输出重定向到系统bin中,不能获知最后命令返回状态,但是通过使用$!,(其返回值为1)可知脚本失败。检验脚本退出状态时,最好将返回值设置为一个有意义的名字,这样可以增加脚本的可读性。

14.5 小结

变量可以使shell编程更容易。它能够保存输入值并提高效率。shell变量几乎可以包含任

何值。特定变量增强了脚本的功能并提供了传递到脚本的参数的更多信息。

ex is not shell_linux超级基础系列——shell变量(本地变量和环境变量)相关推荐

  1. linux超级基础系列——shell变量(本地变量和环境变量)

    linux超级基础系列--shell变量(本地变量和环境变量) 2006-12-04 00:39 为使shell编程更有效,系统提供了一些shell变量.shell变量可以保存诸如路径名.文件名或者一 ...

  2. linux+管道+分段,Linux中shell基础、重定向、管道符、环境变量

    原标题:Linux中shell基础.重定向.管道符.环境变量 1.什么是shell Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口(命令解释器).它接收用户输入的命令并把它送入内核 ...

  3. 简述SHELL全局环境变量与局变环境变量

    在Linux中,很多程序和脚本都通过环境变量来获取系统信息,存储临时数据,配置信息.环境变量是指用来存储有关shell会话和工作环境信息,允许你在内存中存储数据,以便程序或shell中运行的脚本能够轻 ...

  4. shell类型、添加PATH环境变量、.bashrc、.profile、/etc/profile、/etc/environment

    shell类型 使用 cat /etc/shells ,查看用户的可用shell. 使用 echo $SHELL ,查看当前正在使用的shell. 打开terminal终端,shell等待用户输入,并 ...

  5. linux创建环境变量有什么用,环境变量和shell变量到底有什么区别呢?

    open-end 于 2007-06-02 21:21:10发表: 我们仍以BASH 为讨论的shell 语言 每一种编程语言中,我们都会碰到变量的作用域的问题.(比如在函数中定义的变量在函数外不能使 ...

  6. shell命令和编程设置环境变量

    最近,在做一个项目,项目中需要编程设置环境变量.还是第一次见,之前都是用shell和dos命令来设置环境变量.所以来总结一下. 目录 linux系统使用shell设置环境变量 变量简介 定制环境变量 ...

  7. 【Java基础系列教程】第三章 Java变量与运算符

    一.Java程序基本结构 1.1 基本结构 Java程序基本结构示例代码: /** * 这里是文档注释 * 这是一个HelloWorld程序 */ public class HelloWorld {p ...

  8. shell基础(2):编程基础之变量:全局/局部/环境变量(作用域、定义、操作)、位置参数、数组

    对shell变量有一个系统性的了解 变量的种类:局部.全局.环境变量 变量的定义和操作:赋值.取值.取消变量 特殊变量:位置参数. $? 数组的定义和使用 变量的作用域 文章目录 1. 变量的种类 1 ...

  9. shell配置,选择,环境变量修改(ORACLE_HOME,ORACLE_SID),无法使用sqlplus

    ... 零,由于某种误操作,导致用户账户下的shell配置文件丢失被删除 一,你登录到对应主机后,默认使用的那种shell $ echo $SHELL $ pstree $ pstree -up|gr ...

最新文章

  1. DeepChem | 基于图卷积预测分子的溶解度
  2. PyCharm 2019.1 EAP 5 发布,全新的 Jupyter Notebook
  3. Visual C++ 2008入门经典 第十五章 在窗口中绘图
  4. xargs命令_Linux xargs命令:一个给其他命令传递参数的过滤器
  5. linux rc.local权限,Linux开机启动rc.local不执行分析
  6. Struts学习笔记总结
  7. UVa815 - Flooded!
  8. Spring项目启动后报连接MYSQL错误两则
  9. java (Eclipse)连接MySQL数据库
  10. matconvnet 在 win7 64 位下的安装
  11. hdu 1728 逃离迷宫
  12. win10安装visio2010出错_四种解决安装Office 2010时出现错误1907的提示方法介绍
  13. QT 菜单栏、工具栏和状态栏
  14. Codejock Xtreme ToolkitPro 静态链接XTP库以及皮肤库的使用
  15. 【计算机毕业设计】018母婴商城系统
  16. 小程序电商商城怎么搭建?
  17. 计算机(Computer)基础
  18. 关系抽取Casrel实现(Pytorch版)
  19. Python语言系统学习21:作品——简易计算器
  20. 消息代理 - RabbitMQ - 学习/实践

热门文章

  1. 渗透测试报告模板_OSCP 考试报告模板(增强版)
  2. JavaScript childNodes
  3. laravel-admin 结合搭配商品sku
  4. 设置BAT批处理窗口显示颜色
  5. SpringBoot直接URL获取静态资源文件
  6. 【Docker 教程】Docker 创建镜像
  7. [附源码]Python计算机毕业设计SSM基于Java的新冠疫苗预约系统(程序+LW)
  8. 修改 linux、ubuntu 默认终端,外加terminator颜色方案
  9. vue 判断一个参数是否是数组
  10. 配置高档游戏型计算机,内存32G的高端配置电脑,不能玩大型游戏,是什么原因?...