Linux shell程序设计(四).变量-2
变量的内容很多,继续接着昨天的。这次包括:位置变量、预定义变量、环境变量。希望能够都记住。
五、位置参数
1、位置参数及其引用
Linux可以用位置参数来定义命令行上的具体实参,例如:
$ set `pwd;ls;date`
$ echo $0 $1 $2 $3 $4 $5 $6 $11 ${11}
-bash /opt/test a bbb kkk nnn Thu /opt/test1 2009
由上例可见:
① $0对应的是命令名(脚本名)
② $n对应第n个字符串(以空格隔开)
③ $11对应的是$1再跟上"1",若需要显示第11个参数,使用${11}
再举一个例子:
$ cat m1.c
main()
{
printf("Begin\n");
}
$ cat m2.c
main()
{
print("OK!\n");
print("End!\n");
}
$ cat ex6
# ex6:shell script to combine files and count lines
cat $1 $2 $3 $4 $5 $6 $7 $8 $9 | wc -l
# end
$ ./ex6 m1.c m2.c
9
这段代码的意思是:依次打印ex6脚本后面带的实参指定的文件后计算行数(最多9个)
2、用set命令为位置参数赋值
可以利用set命令为位置参数赋值或重新赋值,例如:
$ set a b c
$ echo $0 $1 $3
-bash a c
再举个应用的例子:
$ cat ex7
#!/bin/bash
set m1.c m2.c
cat $1 $2 $3 | wc -l
$ ./ex7
9
3、移动位置参数
可以使用shift命令移动除$0外的所有参数的位置(向右顺移)
$ cat ex8
#!/bin/bash
echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9
shift
echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9
shift 4
echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9
#end
$ ./ex8 A B V F G T R E D S
./ex8 A B V F G T R E D
./ex8 B V F G T R E D S
./ex8 T R E D S
六、预先定义的特殊变量
① $#:表示命令上上的参数个数(不包含命令本身)
② $?:上一条命令执行后的返回值(执行成功为0 | 失败为非0)
③ $$:当前进程的进程号
注:因为每个进程都有唯一进程号,所以可以利用$$作为临时文件的唯一文件名。
④ $!:上一个后台命令对应的进程号(是一个由1-5个数字构成的字符串)
⑤ $-:当前shell设置的执行标识名
$ set -xv
$ echo display current shell flags $-
display current shell flags himvxBH
⑥ $*:列出所有的参数
⑦ $@:基本与$*相同。区别在于:
$ cat ex10
#!/bin/bash
date
set `date`
echo $*
for i in "$*"
do echo $i;
done
echo $@
for i in "$@"
do echo $i;
done
echo "end."
$ ./ex10
Thu Mar 5 16:59:01 CST 2009
Thu Mar 5 16:59:01 CST 2009
Thu Mar 5 16:59:01 CST 2009
Thu Mar 5 16:59:01 CST 2009
Thu
Mar
5
16:59:01
CST
2009
end.
发现$@在for循环时将各个参数分解,而$*不变
七、环境变量
在bash、sh、ksh中可以使用env命令以及不带参数的set命令列出所有已定义的环境变量。
1、常用环境变量
① HOME:用户主目录的全路径名
默认为:/home/userid
可以使用 cd $HOME | cd ~ | cd 来切换回主目录路径。
② LOGNAME:注册名,由Linux自动设置
可以通过LOGNAME变量使系统确认文件的拥有着,有权执行某个命令。
③ MAIL:系统邮箱的地址
默认为:/var/spool/mail/userid
④ PATH:shell从中查找命令的目录列表
多个目录以“:”分开,可以使用以下命令添加目录:
$ PATN=$PATH:$HOME/bin
一般用户自身的命令存放在 /usr/local/bin 目录下
⑤ PS1:shell的主提示符
默认为:\s-\v\$
具体的参数说明如下:
\d:以“星期 月 日”形式的日期
\h:主机名,直至第一个“.”为止
\H:主机全名
\s:所用的shell名称
\t:按24小时制形式表现的时间
\T:按12小时制形式表现的时间
\@:按12小时制am/mp形式表示的时间
\u:当前用户名
\v:bash版本号
\w:当前工作目录
\$:若有效UID为0,则为“#”,否则为“$”
⑥ PWD:当前工作目录路径
⑦ SHELL:当前使用的shell及解释程序位置
⑧ TERM:终端类型
本机:vt100
2、使用环境变量
用echo命令查看任何一个环境变量
$ echo $SHELL
/bin/bash
注:由上可知,用“$”可以引用任何的环境变量作为变量使用
3、删除环境变量
$ unset NAME
注:不要加“$”