说到shell编程之前,先介绍变量,变量在shell编程中是很重要。变量无非就是一堆可变化的值。
变量的的声明遵循以下几条规则:
一,不能跟系统中的变量名重名。如PATH是系统变量,在声明时不要也用PATH当作变量名。
二,不能以数字开关,12USER=bingo这是错误的,最前面不是数字的话,就认为合法,当然变量名只有二种情况,要么全部是英文,要么是英文跟数字组合。等号的两边不能有空格,USERNAME= bingo这种情况声明的USERNAME是空值,且会把bingo当作命令来执行 ,USERNAME = bingo 这种情况会USERNAME当作命令来执行 ,USERNAME =bingo这种情况会USERNAME当作命令来执行。
三,变量内容没有限制,如果变量内容里还有变量,则必须用双引号,不能会出现变量无法替换,如果变量内容有特殊字符则需用\这个跳脱字符将它原来的意义给注释掉,使它变成一个普通的字符来使用。
四,取消变量用unset,如unset USERNAME.
对变量做基本的介绍下面介绍三种条件测试
(1) test expresstion :用于检查文件与比较有效值
(2) [ expreesstion ](判断符号):与test作用一样,在脚本中这种写法很常见
(3) ` expresstion `:一般判断常数之间的大小
(4)命令执行有两种状态:一种叫做命令执行的结果,一种是命令执行结果的状态返回值,
<a href="http://blog.51cto.com/attachment/201206/175023548.jpg" target="_blank"></a>
<a href="http://blog.51cto.com/attachment/201206/175449726.jpg" target="_blank"></a>
(5)命令的引用两种方式``与$(): echo “kernel-`uname -r`" 与echo "kernel-$(uname -r)”。(``反单号,在esc键的下面)效果都一样
(6)算术运算:sum=$(($var1+$var2))与sum=$[$var1+$var2]效果一样
(7)位置参数:执行脚本为$0这个变量,第一个接的参数是$1,第二个是$2,依次累推
<a href="http://blog.51cto.com/attachment/201206/195028509.jpg" target="_blank"></a>
下面介绍if的用法。if 用于条件判断。
1, if 条件测试 ;then
语句...
fi (表示结束if语句)
(1) if test 2 -lt 3;then
echo "this is right."
fi
(2)if [ 2 -lt 3 ];then (注意要与[ ]之间有空格
echo "this is right"
fi
(3) if [[ 2<3 ]];then
echo “this is right”
fi
2,if 条件测试;then(如果条件测试返回的值为真,则执行语句一,否则执行语句二)
语句一....
else
语句二....
(1)if [ 4 -lt 3 ];then
echo "this is right."
else
echo "this is wrong."
fi
(2) if id root &> /dev/null;then(if后面可以写命令,&> /dev/null把id命令执行的执行结果输入到/dev/null,可把/dev/null当作黑洞,永远都填不满)
echo "user exist."
else
echo "user not exist."
3, if 条件测试1;then
语句一...
elif 条件测试2;then (elif可以有多个)
语句二...
语句三...
read -p “please input (y/n):." yn(提示用户输入y/n,并将值存储在变量yn中)
if [ "$yn" = "y" -o "$yn" == "Y" ];then
echo "ok,continue"
elif [ "$yn"= "n" -o "$yn"="N" ];then
echo "break."
echo "input error."
4, case常用于变量的值有多种的时候
case 变量名 in
"第一个变量内容")
语句1....
"第二变量内容”)
语句2....
*) (*表示既不是第一个变量内容也不是第二变量内容)
语句3.....
esac
case "$1" in($1是位置参数,
start)
service network start;;
stop)
service network stop;;
reload)
sevice network reload;;
restart)
service network restart;;
*)
echo "Usage: `basename $0` {start|stop|reload|restart}";;
5,for循环,一般用于知道要循环几次。
for 变量名 in 变量值 ;do
语句1....
done
sum=0
for i in `seq 1 100`;do(seq 是表示从1到100都循环一次,加``表示先执行seq,得到seq命执行结果)
sum=$(($i+$sum))
let i++ (让变量自动加1)
echo "total $sum."
6,while 循环用于变量值不固定的时
while 条件判断;do(条件满足时就循环)
语句...
计算从1到100偶数之和
i=0
while [ $i -le 100 ];do
sum=$(($sum+$i))
let i+=2
echo "total $sum"
7,until 循环正好与while相反,当条件不满足时循环
until 条件判断 do;
语句
until [ $i -ge 100 ];do
sum=$(($sum+$i)
let i++
8,function(函数):简单来说实现代码重复调用。遵循先定义后调用
定义函数两种方式
(1)function fname {
语句.....
}(function 是关键字,fname是函数名
(2) fname () {
语句...
}
FUSER () {
if id $1 &> /dev/null;then
echo "user uid: `id -u $1`,user shell:`grep "^$1\>:" /etc/passwd`
esle
echo "no this user."
}(定义了一个FUSER是函数名,大小写都无所谓)
read -p "input user:" USERNAME
while [ "$USERNAME" != "quit" ];do
FUSER $USERNAME(给函数传递参数也就是$1)
read -p "next user:" USERNAME
done
9, continue:退出当前这一次循环,提前进入下一次循环
i=0
sum=0
if [ $[$%2] -eq 1 ];then
let i++
continue (如果i是奇数,则又从while开始循环)
fi
let sum=$(($sum+$i))
echo "even total: $sum"
10, break: 中断当前循环
read -p "input username:" UNAME
while true;do(true表示不用做判断,开始循环)
if id $UNAME &> /dev/null;then
echo “user uid: `id -u $UNAME &> /dev/null`
echo "no a user: $UNAME."
fi
read -p "n|N for next user,others for quitting."choice
case $choice in
n|N)
read -p "a username:" UNAME;;
*)
break ;;(中止循环,并退出)
esac
done
本文转自 deng304749970 51CTO博客,原文链接:http://blog.51cto.com/damondeng/900301,如需转载请自行联系原作者