(转载)linux中shell变量
(转载)http://blog.csdn.net/zahuopuboss/article/details/8633891
为使shell编程更有效,系统提供了一些shell变量。shell变量可以保存诸如路径名、文件名或者一个数字这样的变量名。shell将其中任何设置都看做文本字符串。
有两种变量,本地和环境。严格地说可以有4种,但其余两种是只读的,可以认为是特殊变量,它用于向shell脚本传递参数。
按照定义来说,变量是存储设备中的一些可读写的存储单元.变量可以定制用户本身的工作环境。使用变量可以保存有用信息,使系统获知用户相关设置。变量也用 于保存暂时信息。例如:一变量为EDITOR,系统中有许多编辑工具,但哪一个适用于系统呢?将此编辑器名称赋给EDITOR,这样,在使用cron或其 他需要编辑器的应用
时,这就是你将一直使用的EDITOR取值,并将之用作缺省编辑器。
$ isql -Udavet -Pabcd -Smethsys
这里- S为正在连接的服务器名称。有一变量DSQUERY保存服务器名称值。设置服务器名称值到DSQUERY变量,这样如果登录时不使用-S提供服务器名称, 应用将查询DSQUERY变量,并使用其取值作为服务器名称。需要做的全部工作就是键入下列命令:
$ isql -Udavet -Pabcd
工作方式同上例。
本 地变量在用户现在的shell生命期的脚本中使用。例如,本地变量file-name取值为loop.doc,这个值只在用户当前shell生命期有意 义。如果在shell中启动另一个进程或退出,此值将无效。这个方法的优点就是用户不能对其他的shell或进程设置此变量有效。
$ variable-name=value 或 $ {variable-name=value}
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,可以被替换
使用echo命令可以显示单个变量取值,并在变量名前加$,例如:
echo $LOGNAME
$dave
可以结合使用变量,下面将错误信息和环境变量LOGNAME设置到变量error-msg。
$ERROR_MSG="sorry, there is not $LOGNAME"
$echo "$ERROR_MSG"
$sorry, there is not dave
使用unset命令清除变量。
unset variable-name
使用不加任何参数的set命令显示所有本地定义的shell变量。
set输出可能很长。查看输出时可以看出shell已经设置了一些用户变量以使工作环境更加容易使用。
将变量并排可以使变量结合在一起:
echo $var_1$var_2
有时要测试是否已设置或初始化变量。如果未设置或初始化,就可以使用另一值。此命令格式为:
$ {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}
可以用变量保存系统命令参数的替换信息。下面的例子使用变量保存文件拷贝的文件名信息。变量source保存passwd文件的路径。
$ source="/etc/passwd"
$ cd $source
如果设置变量时,不想再改变其值,可以将之设置为只读方式。如果有人包括用户本人想要改变它,则返回错误信息。格式如下:
variable-name=value
readonly variable-name
设为只读后,任何改变其值的操作将返回错误信息。要查看所有只读变量,使用命令readonly即可。
环境变量用于所有用户进程(经常称为子进程)。登录进程称为父进程。s h e l l中执行的用户进程均称为子进程。不像本地变量(只用于现在的s h e l l)环境变量可用于所有子进程,这包括编辑器、脚本和应用。
环境变量可以在命令行中设置,但用户注销时这些值将丢失,因此最好在. profile文件中定义。系统管理员可能在/etc/profile文件中已经设置了一些环境变量。将之放入profile文件意味着每次登录时这些值 都将被初始化。传统上,所有环境变量均为大写。环境变量应用于用户进程前,必须用export命令导出。环境变量与本地变量设置方式相同。
VARIABLE-NAME=value;export VARIABLE-NAME
在两个命令之间是一个分号,也可以这样写:
VARIABLE-NAME=value
export VARIABLE-NAME
显示环境变量与显示本地变量一样,用echo命令即可。
使用env命令可以查看所有的环境变量。
使用unset命令清除环境变量
unset VARIABLE-NAME
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=<space><tab>; export IFS
这里<space><tab>为空格和tab键。
5. LOGNAME
此变量保存登录名,应该为缺省设置,但如果没有设置,可使用下面命令完成它:
$ LOGNAME='dave'; export LOGNAME
6. MAIL
MAIL变量保存邮箱路径名,缺省为/var/spool/mail/<loginname>。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保存。
还有一些预留的环境变量。其他系统或命令行应用将用到它们。以下是最常用的一些,注意这些值均未有缺省设置,必须显示说明。
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
在$HOME.profile文件中设置环境变量时,还有另一种方法导出这些变量。使用set命令- a选项,即set -a指明所有变量直接被导出。不要在/etc/profile中使用这种方法,最好只在自己的$HOME/.profile文件中使用。
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"
#!/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
$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"
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
本章开始提到有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
在下面脚本中使用上面的例子。
$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"
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 :
$more param2
#!/bin/sh
echo "this is `basename $0`calling"
this is param2 calling
可以在脚本中向系统命令传递参数。下面的例子中,在find命令里,使用$1参数指定查找文件名。
$more findfile
#!/bin/sh
#findfile
find / -name $1 -print
$more who_is
#!/bin/sh
#who_is
grep $1 passwd | awk -F: {print $4}
既然已经知道了如何访问和使用shell脚本中的参数,多知道一点相关信息也是很有用的,有必要知道脚本运行时的一些相关控制信息,这就是特定变量的由来。共有7个特定变量:
$* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的进程ID号
$@ 与$ #相同,但是使用时加引号,并在引号中返回每个参数
$- 显示shell使用的当前选项,与set命令功能相同
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
注意,$?返回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 ok.txt /usr/bin/aaa/bbb >/dev/null 2>&1
$ echo $?
1
变量可以使shell编程更容易。它能够保存输入值并提高效率。shell变量几乎可以包含任
何值。特定变量增强了脚本的功能并提供了传递到脚本的参数的更多信息。
(转载)linux中shell变量的更多相关文章
- linux中shell变量$#,$@,$0,$1,$2的含义解释
linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...
- linux中shell变量$#,$@,$0,$1,$2的含义解释
linux中shell变量$#,$@,$0,$1,$2的含义解释 linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID ...
- Linux中shell变量$0,$?等含义
linux中shell变量$#,$@,$0,$1,$2的基本含义: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...
- 【转】linux中shell变量$#,$@,$0,$1,$2的含义解释
原文网址:http://www.cnblogs.com/fhefh/archive/2011/04/15/2017613.html linux中shell变量$#,$@,$0,$1,$2的含义解释: ...
- 【Shell】linux中shell变量$#,$@,$0,$1,$2的含义解释 && set 关键字使用
linux中shell变量$#,$@,$0,$1,$2的含义解释 摘抄自:ABS_GUIDE 下载地址:http://www.tldp.org/LDP/abs/abs-guide.pdf linu ...
- linux中shell变量$#,$@,$0,$1,$2的含义
linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...
- linux中shell变量$#,$@,$0,$1,$2
linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...
- 浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释
浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释 下面小编就为大家带来一篇浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释.小编觉得挺不错的,现在就分享给 ...
- linux中shell变量$#,$@,$0,$1,$2的含义解释<转>
linux中shell变量$#,$@,$,$,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行的命 ...
- linux中shell变量$#等的释义
linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: 1. $$ Shell本身的PID(ProcessID) 2. $! Shell最后运行的后台Process的PID 3 ...
随机推荐
- css height:100%失效
有时做移动端页面时,需要用到height:100%来控制,但是设置完后会发现,用百分比的高是不生效的. 经过上网浏览等查阅资料得知,是否可以使用百分比是根据父级对象定义的.所以解决方法就是在body和 ...
- 【原创教程】虎咽CSS
上节课我们讲了HTML基础,回顾的事我不干了,因为你可以回头看很多遍,这节课我们来学习下CSS这门艺术的基础知识,一直以来我们都是CSS,CSS那么CSS到底是什么呢,惯例,我又来一层一层把CSS ...
- NFC简介
NFC简介 NFC是Near Field Communication缩写,即近距离无线通讯技术.由飞利浦和索尼公司共同开发的NFC是一种非接触式识别和互联技术,可以在移动设备.消费类电子产品.PC 和 ...
- oracle学习笔记4:PL/SQL
PL/SQL是没命名的存储过程,函数,触发器,PL/SQL块的语法格式如下: [declare] --声明部分,可选 begin --执行部分,必须 [exception] --异常处理部分,可选 e ...
- js获取css属性方法
function getDefaultStyle(obj,attribute){ return obj.currentStyle?obj.currentStyle[attribute] : docum ...
- 移动端利用iscroll实现小图变大图
大图界面,使用iscroll,定义如下: var myScroll; function loaded(){ myScroll = new iScroll('wrapper', { zoom:true, ...
- 帝国cms7.0修改“信息提示”框
具体修改查看e/message/index.php文件 上传一张合适用的图 <table width="600" height="224" border= ...
- CANoe 入门 Step by step系列(二)CAPL编程【转】
CAPL就是Communication Application Programming Laguage的缩写,CAPL类似于C语言的语法,因此所有的语法请参考C语言教程,这里不在这里进行详述,关于C语 ...
- Day18 Django之路由系统、模板语言、Ajax、Model
一.路由系统 1.创建Django项目 django-admin startproject day18 cd day18 python3 manage.py startapp app01 2.app0 ...
- 编译u-boot命令和u-boot常用命令
一.编译u-boot命令 1.配置开发板 #make TQ2440_config 2.编译 #make all 3.交叉编译器是crosstools_3.4.5_softfloat” 使用4.3.3版 ...