shell 不保存退出_linuxshell编程之环境变量和shell变量

本地变量

  • 本地变量在用户现在的 shell生命期的脚本中使用。如果在shell中启动另一个进程或退出,此值将无效。这个方法的优点就是用户不能对其他的 shell或进程设置此变量有效。
  • 格式
$ variable-name(变量名)=value(所赋的值)
或 $ { variable -name =value }
注:使用变量时,如果用花括号将之括起来,可以防止 shell误解变量值。
  • 变量设置时的不同模式:

eb74646bf3e8be9a563c86cee9bc4f4d.png


例:

[root@localhost home]# great_number=30
[root@localhost home]# echo ${great_number}
30
[root@localhost home]# great_char="hello,world"
[root@localhost home]# echo ${great_char}
hello,world
  • 清除变量
    使用unset清除变量
    格式:
unset variable-name

例:

root@localhost home]# unset great_char
[root@localhost home]# echo ${great_char}

[root@localhost home]# unset _number
[root@localhost home]# echo${great_number}
  • 显示所有本地shell变量
    使用set命令显示所有本地定义的shell变量。
[root@localhost home]# set
ABRT_DEBUG_LOG=/dev/null
BASH=/usr/bin/bash
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

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

  • 结合变量值
    将变量并排可以使变量结合在一起:
echo ${variable_name}${variable_name}・・・

例:

[root@localhost home]# name='xierbi'
[root@localhost home]# familyname='tom
[root@localhost home]#${name}${familyname}
bash: xierbitom:
  • 测试变量是否已经设置
    (1)如果未设置或初始化,就可以使用另一值。此命
    令格式为:
$ { variable: -value}

例:

[root@localhost home]# colour=blue
[root@localhost home]# echo "The sky is ${colour:-grey} today"
The sky is blue today
[root@localhost home]# unset colour
[root@localhost home]# echo "The sky is ${colour:-grey} today"
The sky is grey today
[root@localhost home]# echo ${colour}

[root@localhost home]#

如果设置了变量值,则使用它,如果未设置,则取新值.变量colour取值blue,echo打印变量colour时,首先查看其是否已赋值,如果查到,则使用该值.且并没有实际赋值,可以看到colour的值仍是空的。
(2)要完成检测是否赋值,没有赋值需要赋新值,需要使用下面格式:

${variable:=value}

(3)测试变量是否取值,然后返回带有系统错误信息的结果。

variabl:?value
[root@localhost home]# echo "The sky is ${colour:? "the variable have no value"}"
bash: colour:  the variable have no value

coulour并没有赋值,出现提示字符
(4)
测试变量是否取值,如果未设置,则返回一空串。方法如下:

$ { variable: + value}
  • 设置只读变量
    如果设置变量时,不想再改变其值,可以将之设置为只读方式。如果有人包括用户本人想要改变它,则返回错误信息。格式如下:
variable-name =value
readonly variable-name

环境变量

环境变量和本地便量显著的区别就在于本地变量只能用于所在的shell文件中,而环境变量应用于所有进程,包括编辑器脚本和应用。
传统上,所有环境变量均为大写。环境变量应用于用户进程前,必须用 export命令导出。环境变量与本地变量设置方式相同。
环境变量可以在命令行中设置,但用户注销时这些值将丢失,因此最好在 . profile文件中定义。

  • 设置环境变量
VARIABLE-NAME=value;export VARIABLE-NAME
在两个命令之间是一个分号,也可以这样写:
VARIABLE-NAME = value
Export VARIABLE-NAME
  • 显示环境变量、清除环境变量、显示所有环境变量和本地变量相同
[root@localhost home]# CONSOLE=shell; export CONSOLE
[root@localhost home]# echo ${CONSOLE}
shell
[root@localhost home]# unset CONSOLE
[root@localhost home]# echo ${CONSOLE}

[root@localhost home]# env
XDG_VTNR=1
XDG_SESSION_ID=1
SSH_AGENT_PID=2461
HOSTNAME=localhost.localdomain
,,,,,,,
  • 嵌入shell变量
    Brourne shell 有一些预留的环境变量名,这些变量名不能用作其他用途。通常在
    / etc/ profile中建立这些嵌入的环境变量。
    (1)CDPATH
    改变目录路径变量,保留一系列由冒号隔开的路径名,用于cd命令.如果设置了CDPATH,cd一个目录时,首先查找CDPATH,如果CDPATH指明此目录,则此目录成为当前工作目录.
$ CDPATH=:/home/dave/bin:/usr/local/apps;export CDPATH.

如果要

$ cd apps

cd命令首先在CDPATH中查找目录列表,如果发现 apps,则它成为当前工作目录。
(2)EXINIT
该变量保存使用vi编辑器时的初始化选项,例如,调用vi时,要显示行号,且在第十个空格加入tab键,命令:

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

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

$cd $HOME

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

$echo $PATH
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/smallfish/bin$export
IFS=:
$echo $PATH
/usr/kerberos/bin /usr/local/bin /bin /usr/bin /usr/X11R6/bin /home/smallfish/bin

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

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

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

$ MAILCHECK=120;export MAILCHECK

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

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

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

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

$PS1="star trek:"; export PS1
star trek:
$PS1="->";export PS1
->

(9)PS2
PS2为附属提示符,缺省为符号>.PS2用于执行多行命令或超过一行的一各命令.

$PS2="@:"; export PS2
$for loop in *
@:do
@:echo $loop

退出PS2用Ctrl+C

(10)SHELL
SHELL变量保存缺省shell,通常在/etc/passwd中已设置,但如果有必要使用另一个shell,可以用如下方法覆盖当前shell:

$echo $SHELL/bin/bash

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

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

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

$TERM=vt100;export TERM

(13).TZ
时区变量保存时区值,只有系统管理员才可以更改此设置,例:

$echo $TZ
GMT2EDT

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

  • 还有一些预留的环境变量.其他系统或命令行应用将用到它们.以下是最常用的一些,注意这些值均未有缺省设置,必须显示说明.
    1.EDITOR
    设置编辑器,最常用.
$EDITOR=vi;export EDITOR

2.PWD
当前路径名,用cd命令设置此选项
3.PAGER
保存屏幕翻页命令,如pg,more,在查看man文本时用到此功能.

$PAGE='pg -f -p';export PAGER

4.MANPATH
保存系统上man文本的目录.目录间用马号分隔.

$MANPATH=/usr/apps/man:/usr/local; export MANPAGE5.LPDEST或PRINTER$LPDEST=hp3si-systems

将变量导出到子进程

定义的变量如何导出到子进程?
导出形式:

export 变量名

下面举个例子来说明:
b.sh

#father script.
echo "this is the father"
FILM="A Few Good Men"
echo "I like the film:$FILM"
./b2.sh   #call the child (执行子进程文件) 
echo "back to father"
echo "and the film is:$FILM"

b2.sh

#!/bin/sh
#child
echo "called from father..i am the child"
echo "film name is :$FILM"
FILM="Die Hard"
echo "changing film to :$FILM"

执行:

[root@localhost home]# sh b.sh
this is the father
I like the film:A Few Good Men
b.sh:行8: ./b2.sh: 权限不够
back to father
and the film is:A Few Good Men

如果出现权限不够字样是因为b2.sh文件权限为不可执行,我们添加文件权限即可:

chmod u+x b2.sh

结果:

[root@localhost home]# sh b.sh
this is the father
I like the film:A Few Good Men
called from father..i am the child
film name is :
changing film to :Die Hard
back to father
and the film is:A Few Good Men

可以看到子进程b2.sh并没有继承父进程的变量,所以为空。我们利用export导出进行改写:

#!bin/sh
#father script.
echo "this is the father"
FILM="A Few Good Men"
echo "I like the film:$FILM"
#call the child scri
export FILM   #导出变量到b2.sh
./b2.sh
echo "back to father"
echo "and the film is:$FILM"

结果:

[root@localhost home]# sh b.sh
this is the father
I like the film:A Few Good Men
called from father..i am the child
film name is :A Few Good Men
changing film to :Die Hard
back to father
and the film is:A Few Good Men

最后,可以看到b2.sh接受到了FILM的值。

位置变量参数

可以向shell文件中$0~$9这9个位置直接传送信息

  • 在脚本中使用位置参数
    例:
#!/bin/sh
#b.sh
echo "This is the script name :$0" 
echo "This is the first parameter : $1"
echo "This is the second parameter : $2"
echo "This is the third parameter : $3"
echo "This is the fourth parameter : $4"
echo "This is the fifth parameter : $5" 
echo "This is the sixth parameter : $6" 
echo "This is the seventh parameter : $7" 
echo "This is the eighth parameter : $8" 
echo "This is the ninth parameter : $9"

在shell文件后直接加所要传递的信息,给9个值的信息分别空格隔开

sh b.sh im Mr tom ,i  am very cool

执行结果:

[root@localhost home]# sh b.sh im Mr tom ,i  am very cool
This is the script name :b.sh
This is the first parameter : im
This is the second parameter : Mr
This is the third parameter : tom
This is the fourth parameter : ,i
This is the fifth parameter : am
This is the sixth parameter : very
This is the seventh parameter : cool
This is the eighth parameter : 
This is the ninth parameter :
  • 向系统命令传递参数
    可以在脚本中向系统命令传递参数。
    例:
#!/bin/sh
# findfile
find / -name $1 -print

运行结果:

[root@localhost home]# sh b.sh password
/etc/openldap/certs/password
[root@localhost home]#
  • 特定变量参数

特定s h e l l变量

$ #    传递到脚本的参数个数
$ *    以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过 9个
$ $   脚本运行的当前进程I D号
$ !    后台运行的最后一个进程的进程 I D号
$ @  与$ #相同,但是使用时加引号,并在引号中返回每个参数
$ -   显示s h e l l使用的当前选项,与s e t命令功能相同
$ ?   显示最后命令的退出状态。 0表示没有错误,其他任何值表明有错误。

注意:$ ?返回0。可以在任何命令或脚本中返回此变量以获得返回信息。基于此信息,可
以在脚本中做更进一步的研究,返回 0意味着成功,1为出现错误。
下面的例子拷贝文件到/ t m p,并使用$ ?检查结果。

$ cp ok. txt /tmp
$ echo $?
0

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

$ cp ok.txt /usr/local/apps/dsf
cp: cannot create regular file '/usr/local/apps/dsf': No such file or directory
$ echo $?
1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值