一、变量的种类:
本地变量:用户自定义的变量。
环境变量:用于所有用户变量,用于用户进程前,必须用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) |