提示:
“引用”一个命令的执行结果,要使用命令引用;比如: RESAULTS=`wc -l /etc/passwd | cut -d: -f1`;
使用一个命令的执行状态结果,要直接执行此命令,一定不能引用;比如: if id user1一句中的id命令就一定不能加引号;
如果想把一个命令的执行结果赋值给某变量,要使用命令引用,比如USERID=`id -u user1`;
如果想把一个命令的执行状态结果保存下来,并作为命令执行成功与否的判断条件,则需要先执行此命令,而后引用其状态结果,如
id -u user1
RETVAL=$?
此句绝对不可以写为RETVAL=`id -u user1`;
在写关于添加用户的脚本时遇到了条件判断用户存不存在时的一些问题。这个脚本实现的功能就是判断一个用户存不存在,存在就显示存在,不存在就添加。就是这么简单的一个脚本花了我一个多小时,作为小白的我还是总结一下,以免后面再犯错误。 根据一开始的提示我写的第一个脚本是这样的
#!/bin/bash
name=user1
if [ id $name &> /dev/null ];then
useradd $name &> /dev/null
echo "user $name add finished"
else
echo "user $name exit"
fi
因为想要获得命令执行状态结果时,不需要加那个单引号,所以我一开始觉得这个脚本没有问题,命令执行正确的时候返回值时0,错误的时候是非0的其他值。那么根据我C语言知识来说if后面是0的话就是非执行状态结果正确的信息就要在else后面显示,错误的信息就要在then后面显示。但是这个结果大错特错!!!!!!!!!
if [ ];then
echo "A"
else
echo "B"
fi
在我用这个脚本测试的时候,只有[ ]里面为空的时候,也就是什么都没有的时候才会执行else echo B,不管[ ]里面是0还是任何的其他值,都执行then后面的语句 echo A。这就证明了一个道理:零不代表没有!,而且就像上面的错误脚本一样,不管是正确的还是错误的都有返回值,所以都是执行then后的语句。
所以我就变换了方法,这样写:
#!/bin/bash
name=user1
id $name &> /dev/null
reval=$?
if [ $reval -eq 0 ];then
echo "user $name exit"
else
useradd $name &> /dev/null
echo "user $name add finished"
fi
这样就用到了一开始的提示,如果需要保存上一条命令的执行状态结果的话,就用一个变量存起来。
但是还有一种方法:
#!/bin/bash
name=user1
if id $name &> /dev/null ;then
echo "user $name exit"
else
useradd $name &> /dev/null
echo "user $name add finished"
fi
这种方法就不需要加条件测试判断符号[ ]。 这样就简单了,如果user这个用户存在就执行then后面的语句,如果user用户不存在就执行else后面的语句。
学习知识,尤其是机算计知识还是要注重实践,当然首先是要坚持!!!