在编写脚本时,要注意参数的形式和传递方式,我们今天就一起来学习一下:
shell的环境变量
shell的环境变量分为可写的可读的和环境变量两大类:
1、可写的环境变量
可以对它们赋值,大部分可写的shell环境变量都在登录过程中执行“/etc/profile”文件时进行初始化。改文件由系统管理员设置,用于为系统上的所有用户建立一个公共环境。
用户也可以通过修改自己的启动文件“.bash_profile”中的部分或所有变量的值来定制自己的运行环境,新建用户账号时,系统会为每一个用户都建立一个“.bash_profile”文件,每次用户登录时都要执行它。表中列出大部分可以修改的shell环境变量:
环境变量 |
含义 |
CDPATH |
包含一系列目录名;如果该变量未设置,cd命令将搜索当前目录 |
ENV |
UNIX/Linux查找配置文件的路径 |
HOME |
用户初次登录时的起始目录名 |
|
用户的系统邮箱文件的名称 |
MAILCHECK |
Shell检查用户邮箱并通知用户的间隔时间(单位为秒) |
PATH |
包含用户搜索路径的变量 |
PPID |
父进程的进程ID |
PS1 |
命令行上的Shell提示符,普通用户是“$”,管理员是“#” |
PS2 |
如果Shell认为一个命令尚未结束,会在第二行显示提示符提示继续输入 |
PWD |
当前工作目录的名称 |
TERM |
用户控制终端的类型 |
例如:执行显示系统提示符环境变量的值
[root@localhost ~]# echo $PS1
[\u@\h \W]\$
注意:环境变量一般都是大写的,若要修改,直接用赋值的方式就可以。
2、只读的shell环境变量
只读的环境变量意味着用户能使用和读取它们的值,但不能修改。它也分为两类:
(1)特殊的环境变量
指系统预先定义好的,用户不能重新设置,常见的只读环境变量如下表:
环境变量 |
含义 |
$0 |
Shell程序名 |
$1-$9 |
第1个至第9个命令行参数的值 |
$* |
所有命令行参数的值 |
$#/$@ |
命令行参数的总数 |
$$ |
当前进程的进程ID(PID) |
$? |
最后执行的一条命令的退出状态,0为成功,非0为失败 |
$! |
在后台运行的最后一个进程的进程ID |
$- |
显示Shell使用的当前选项,与set命令功能相同 |
注意:$*和$@的不同点:
只有在双引号中体现出来,如下:
[root@localhost ~]# cat test4
#!/bin/bash
for i in "$*";do
echo $i
done
for i in "$@";do
echo $i
done
[root@localhost ~]# bash test4 1 2 3
1 2 3 //把“1 2 3”看成了一个参数
1
2
3
(2)位置参数
用于处理命令行参数,出现在命令行上的位置确定的参数。
在Bash中总共有十个 位置参数,其对应的名称依次是$0,$1,$2,...,$9。其中$0始终表示命令名或脚本名,对于一个命令行,必然有命令名也就是$0;而其他位置参数根据实际要求,可有可无。
①输出位置参数
[root@localhost ~]# cat > test1 //利用屏幕复制的方法建立脚本文件
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $0
Ctrl+D //保存并结束
[root@localhost ~]# sh test1 a b c d e f g
a b c d e f g test1 //运行结果
②用set命令给位置参数赋值
[root@localhost ~]# cat > test2
echo $1 $2 $3
set m1 m2 m3 //m1,m2,m3分别赋值给$1,$2,$3
echo $1 $2 $3
[root@localhost ~]# bash test2 a b c
a b c
m1 m2 m3
③移动位置参数
此处我们引入shift,每执行依次shift命令,就把位置参数整体向左移一位,但不能将$0的值移走。
[root@localhost ~]# cat test3
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 $#
[root@localhost ~]# sh test3 a b c d e f g h i j k
test3 a b c d e f g h i 11
test3 b c d e f g h i j 10
test3 f g h i j k 6