- 环境变量:可以在所有的用户进程中使用。登录进程是父进程,shell进程是子进程。父进程初始化环境变量,子进程就都可以使用了。对应的声明文件是:/etc/profile 、~/wuxiangdong/.bash_profile
变量的声明方式,export JAVA_HOME=‘/usr/local/jdk7‘
- 本地变量(局部变量) :作用域在一个shell,关闭终端,再开启一个,原来声明的变量不见了;变量设置为只读后不可废弃,不可修改。变量的声明方式:LOCALTEST=‘HELLO,BOY’echo$LOCALTEST。
- 局部变量:作用域只对当前的代码段有效,local VARNAME=value。
- 位置变量:$1,$2,$3,$4这样的变量,取参数的位置。
- 特殊变量:
$?上一个命令的状态返回值。
$#参数的个数
$*参数列表
[email protected]参数列表
$0命令本身 脚本本身
程序状态返回代码(0-255) 0: 正确执行 1-255:错误执行,1,2,127系统预留;
注意:
set命令结果是与shell类型有关。
env查询的是当前用户所有的环境变量的情况。
export 查询的是当前导出成用户变量的shell变量。
撤销变量:unset
变量名称:
1、只能包含字母、数字和下划线,并且不能数字开头;
2、不应该跟系统中已有的环境变量重名;
3、最好做到见名知义;
变量声明格式:
- declare -i SUM=0
integer
- -x(声明成环境变量)
- let A=0;(声明算术变量)
测试脚本是否有语法错误:
bash -n 脚本 检查是不是有错误
bash -x 脚本:单步执行
3.shell编程基础
1)shebang:魔数
#!/bin/bash
#开头的是注释行,是不执行的。
/dev/null :软件设备,bit bucket,数据黑洞。
注意事项:
脚本在执行时会启动一个子shell进程;
命令行中启动的脚本会继承当前shell环境变量
系统自动执行的脚本(非命令行启动)就需要自我定义需要各环境变量;
2)脚本的开始
SHELL-1
1 #有没有bash结尾的用户,有显示出来,没有显示没有!
2 #!/bin/bash
3 #
4 LINES=`grep "\<bash$" /etc/passwd | wc -l `
5 USERS=`grep "\<bash$" /etc/passwd | cut -d: -f1`
6 if [ $LINES -gt 0 ]; then
7 echo -n "there are $USERS"
8 else
9 echo "no such user."
10 fi
11
提示:“引用”一个命令的执行结果,要使用命令引用;比如: RESAULTS=`wc -l /etc/passwd | cut -d: -f1`;
使用一个命令的执行状态结果,要直接执行此命令,一定不能引用;比如: if id user1一句中的id命令就一定不能加引号;
如果想把一个命令的执行结果赋值给某变量,要使用命令引用,比如USERID=`id -u user1`;
如果想把一个命令的执行状态结果保存下来,并作为命令执行成功与否的判断条件,则需要先执行此命令,而后引用其状态结果,如
id -u user1
RETVAL=$?
SHELL-2
给定一个文件,比如/etc/inittab
判断这个文件中是否有空白行;
如果有,则显示其空白行数;否则,显示没有空白行。
#!/bin/bash
LINES=`grep "^$" /etc/inittab|wc -l`
if [ $LINES -gt 0 ];then
echo "$LINES"
else
echo "NO Blank"
fi
SHELL-3
练习:写一个脚本
给定一个用户,判断其UID与GID是否一样
如果一样,就显示此用户为“good guy”;否则,就显示此用户为“bad guy”。
#!/bin/bash
USERNAME=user1
USERID=`id -u $USERNAME`
GROUPID=`id -g $USERNAME`
if [ $USERID -eq $GROUPID ]; then
echo "Good guy."
else
echo "Bad guy."
fi
如果不用id命令
#!/bin/bash
#
USERNAME=user1
if ! grep "^$USERNAME\>" /etc/passwd &> /dev/null; then
echo "No such user: $USERNAME."
exit 1
fi
USERID=`grep "^$USERNAME\>" /etc/passwd | cut -d: -f3`
GROUPID=`grep "^$USERNAME\>" /etc/passwd | cut -d: -f4`
if [ $USERID -eq $GROUPID ]; then
echo "Good guy."
else
echo "Bad guy."
fi