您的位置:首页 > 运维架构 > Shell

shell变量(环境变量、参数变量)实例详解

2015-04-25 10:31 603 查看
我只简单的总结Shell变量常见的使用情况,变量的详细信息参考:http://lovelace.blog.51cto.com/1028430/1211141

1.变量的赋值

格式: NAME=value (注意等号两边不能有空格)
name=proinsight
# 正确   方法1

name = proinsight
#
错误,不能有空格

name=
"proinsight"
#
正确   方法2

name=
'proinsight'
#
正确   方法3

如果传入的值中不包含空格等分割符, 采用方法1,2,3。如果传入的值中包含空格等分割符,采用方法2,3。如果传入的值包含其它变量,采用方法2。
如何将hello world 赋值给sentence变量:
sentence=
"hello world"
#
正确

sentence=
'hello world'
#
正确

sentence=hello world
#
错误

sentence=
"hi,
$name"
#正确,sentence值为: hi, proinsight

sentence=
'hi,
$name'
#错误,sentence值为: hi, $name

小结:" "(双引号) 与 ' ' (单引号) 的区别

在双引号中,变量名称将被变量值所替代。

在单引号中,变量名称,或者任何其他文本都会不经修改而传出来。

变量的调用

在变量前加$,同样,变量的调用也有三种方法
name=
"proinsight"

echo
$name
#方法1

echo
${name}
#方法2

echo
"$name"
#方法3

通常情况下方法1、2、3都可以。只是在一些特殊条件下,方法1无法处理
如何输出name值的同时加入abc后缀,既输出proinsightabc
echo
$nameabc
#错误,会把nameabc看成一个变量,并输入变量值。

echo
${name}abc
#正确

2.环境变量

当shell脚本运行时,一些变量会根据环境设置中的值进行初始化,这些变量通常以大写字母命名,区别于用户以小写字母命名的局部变量。一些通用的环境变量如下图所示:

$HOME:    当前用户的家目录
$PATH:    以冒号分割的用来搜索命令的目录
$PS1:     命令提示符,通常是$字符,如:[\u@\h\w]$
$PS2:     二级提示符,用来提示后续的输入,通常是>
$IFS:   输入域分隔符,通常是空格、制表符、换行符
$0:    SHELL脚本的名字
$#:       传递给脚本的参数个数
$$:       shell脚本的进程号,通常用来生成唯一的临时文件,如/tmp/tmpfile_$$


3.参数变量
其实,当我们执行一个 shell script 时,在这个 shell script 里面就已将帮我们做好一些可用的变量了。 举例来说,在不久的将来,您就会发现,当我们要启动一个系统服务时,可能会下达类似这样的指令:

[root@linux ~]# /etc/init.d/crond restart

那是啥玩意儿?呵呵!就是『向 /etc/init.d/crond 这个 script 下达 restart 的指令』, 咦!我们不是都使用 read 来读取使用者输入的变量内容吗?为啥我可以直接在 script 后面接上这个参数? 这是因为 shell script 帮我们设定好一些指定的变量了!变量的对应是这样的:

/path/to/scriptname opt1 opt2 opt3 opt4 ...

$0 $1 $2 $3 $4 ...

这样够清楚了吧?执行的文件名为 $0 这个变量,第一个接的参数就是 $1 啊~ 所以,只要我们在 script 里面善用 $1 的话,就可以很简单的立即下达某些指令功能了! 其它的一些预设参数如下:

$# : 传递到脚本的参数个数
$* : 以一个单字符串显示所有向脚本传递的参数,各个参数之间用环境变量IFS中的第一个字符分隔开。如果IFS被修改了,那么$*命令分割参数的方式将随之改变。
    与位置变量不同,此选项参数可超过 9个,如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$ : 脚本运行的当前进程 ID号
$! : 后台运行的最后一个进程的进程 ID号
$@ : 是$*的一种精巧变体,它不使用IFS,使用时加引号,并在引号中返回每个参数,双引号里的$@把各个参数扩展为彼此分开的域,所以即使IFS为空,参数也不会挤在一起。
    一般来说,你想访问shell脚本程序的参数,推荐使用$@。
    如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$- : 显示shell使用的当前选项,与 set命令功能相同。
$? : 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。


实例:

# Program:
#       This program will show the use of shell variable
# History:
# 2015/1/4 Alex First release

# $0:.......
echo "path of script : $0"
# ..basename...........
echo "name of script : $(basename $0)"
# $1...1
echo "parameter 1 : $1"
# $2...2
echo "parameter 2 : $2"
# $3...3
echo "parameter 3 : $3"
# $4...4
echo "parameter 4 : $4"
# $5...5
echo "parameter 5 : $5"
# $#:..........
echo "The number of arguments passed : $#"
# $*:........i
echo "Show all arguments : $*"
# $:.......ID.
echo "Process ID : $$"
# $?:...
echo "errors : $?"

测试:
deyuy/bin/my_shell >> ls -l |grep var.sh
-rw-rw-r--   1 deyuy    deyuy        607 Jan  4 02:09 var.sh
deyuy/bin/my_shell >> chmod 755 var.sh
deyuy/bin/my_shell >> ls -l |grep var.sh
-rwxr-xr-x   1 deyuy    deyuy        607 Jan  4 02:09 var.sh
deyuy/bin/my_shell >> ./var.sh
path of script : ./var.sh
name of script : var.sh
parameter 1 :
parameter 2 :
parameter 3 :
parameter 4 :
parameter 5 :
The number of arguments passed : 0
Show all arguments :
Process ID : 25860
errors : 0
以上我们只输入了./var.sh,没有输入任何参数,下面我们输入3个参数老虎、狼、兔子对比一下:
deyuy/bin/my_shell >> ./var.sh tiger wolf rabbit
path of script : ./var.sh
name of script : var.sh
parameter 1 : tiger
parameter 2 : wolf
parameter 3 : rabbit
parameter 4 :
parameter 5 :
The number of arguments passed : 3
Show all arguments : tiger wolf rabbit
Process ID : 18818
errors : 0


有了这些预设变量,我们可以再我们的脚本里进行很多处理,而不必关注具体传递的参数是什么,是不是很好用!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: