Chinaunix首页 | 论坛 | 博客
  • 博客访问: 330356
  • 博文数量: 69
  • 博客积分: 2090
  • 博客等级: 大尉
  • 技术积分: 708
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-23 09:31
文章分类

全部博文(69)

文章存档

2012年(1)

2011年(4)

2010年(48)

2009年(14)

2008年(2)

我的朋友

分类:

2010-08-15 16:11:28

一、变量的种类:
本地变量:用户自定义的变量。
环境变量:用于所有用户变量,用于用户进程前,必须用export命令导出。
位置变量:$0(脚本名),$1-$9:脚本参数。
特殊变量:脚本运行时的一些相关信息。

 $# 传递到脚本的参数个数
 $* 传递到脚本的参数,与位置变量不同,此选项参数可超过9个  
 $$ 脚本运行时当前进程的ID号  
 $! 后台运行的(&)最后一个进程的ID号 
 $@ 与$*相同,使用时加引号,并在引号中返回参数个数
 $-上一个命令的最后一个参数 
 $? 最后命令的退出状态,0表示没有错误,其他任何值表明有错误 


区别$@和$*:这两个除了在加双引号使用是不同,其他情况都是相同的。加双引号时,$*把所有的位置参数看作是一个参数,包括分隔符等,$@还是生成一串参数,每个位置参数仍然是一个单独的参数

例如有如下脚本test.sh

#!/bin/bash #区别位置参数$@和$*之间的区别 

var=""

 n1=0 

n2=0 

for var in "$*" 

do 

    ((n1++)) 

done 

echo "n1=$n1" 


for var in "$@" 

do 

     ((n2++)) 

done 

echo "n2=$n2"


执行:bash test.sh a b c
执行结果为:
   n1=1
   n2=3
说明 "$*"将所有的参数作为一个整体,而"$@"中所有的参数还是单个的参数


二、了解shift 和 set 
1、Shift :左移命令行参数,向左移动时,第一个参数($1)被丢弃,第二个参数($2)变成第一个参数   ($1),第三个参数($3)变成第二个参数($2),以此类推。。。而且,参数个数($#)也会减少一个

2、set :  初始化命令行参数 ,set命令把set后面的几个参数赋值给命令行参数
例如: 在一个脚本中 set cat a is it ;echo $4 $3 $2 $1
得到的结果为:it is a cat

单独使用set命令:返回当前环境下所有的定义的变量
set +/-o:开启或关闭shell特性
如:set  -o noclobber  关闭文件覆盖特性
   set +o noclobber  打开文件覆盖特性

注意:shell 会依据 IFS 将 命令行上 所输入的文字给拆解为"字段"。然后再针对特殊字符(meta)先作处理,最后再重组整行command line 。

三、当执行一个shell脚本的时候,其实是产生一个子shell进程,由子shell再去执行脚本中的命令。
export   将变量导出为环境变量;环境变量只会影响子shell,不会影响父shell。
source 就是让 shell 脚本在当前 shell 内执行、而不是产生一个 子shell 来执行,因此脚本中对变量的改变就会影响到当前的shell。
     利用这个suorce命令。我们就可以实现,在一个脚本A中写一些function,然后在另外的一个文件中source  A ,然后就直接调用这些函数,这个功能将在函数一节中讲到。
exec  在新shell进程中执行脚本,而父shell进程将会被终止
例如,有如下脚本test.sh:  
 #!/bin/bash                                        
echo $$                                           
# 分别用bash ./test.sh  source ./test.sh和exec 运行,查看结果
阅读(695) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~