1。分支
也就是判断了,先介绍下test(这里牵扯到一个问题,我们写shell时候无论是变量,还是文件名尽量不要和指令名冲突),例如我们想看看当前目录下是否有first.sh这个文件,有就输出haha ,没有就heihei.
[root@liumengli my_shell]# cat shell_example.sh
#!/bin/sh
if [ -f first.sh ]
then
echo 'This file exit!'
else
echo 'do not exit!'
fi
exit 0
[root@liumengli my_shell]#
#!/bin/sh
if test -f first.sh
then
echo 'This file exit!'
else
echo 'do not exit!'
fi
exit 0
这里test有2中写法,一个是[] 另一个是test,我倾向于[],因为看上去比较清楚,注意的是[]里面2边都记得和判断体有空格,不然会出错(shell对空格要求还真是死,麻烦的东西)。上面就囊括了语法了,语法也不多说了,但大家会对判断体有些疑问,-f first.sh啥意思,意思就是是否在当前目录下能找到first.sh文件,如何比较其它的呢,比如比较2个数大小,我怎么知道那些可以做为判断体,那些不行呢,例如:判断 猫是否是狗这个是否可行呢???这个我也记不住,但也不需要记住,大家执行下man test 就很清楚了,不记得就去查。
帮助手册上有的就不列举了, test比较有3大类,字符串比较,算术比较(貌似我到现在还没写过算术shell脚本),与文件有关的测试
刚看了if的控制结构,这里列举下
if condition
then
statement
else
statement
fi
记得换行要清楚,不然会出错,当然可以通过加;号来避免,当这样既不出错,可读性又好的写法还是比;号好用不是。;号的写法像这样
#!/bin/sh
if [ -f first.sh ];then
echo 'This file exit!'
else
echo 'do not exit!'
fi
exit 0
到目前为止,还有个问题,我的分支只有2条路,那我想要第3个岔路呢?那就用到了elif,下面是例子
[root@liumengli my_shell]# cat shell_example.sh
#!/bin/sh
echo "Hello, is it morning? Please answer yes or no?"
read time
if [ $time = "yes" ]; then
echo 'Good morning'
elif [ $time = "no" ]; then
echo 'Good afternoon'
else
echo 'Your answer is not recognized!'
exit 1
fi
exit 0
还有一个重要用法就是
if 命令1
then
命令2
else
命令3
fi
exit 0
如果命令1成功运行(意思就是exit 0)执行命令2,如果命令1执行失败(意思就是exit 1或其他非0的数)就会执行命令命令3
其实
if 命令1 就是等于 命令1 if [ $? -eq 0 ] $?记载的是上一个命令的返回状态。
2循环
for循环,样例
#!/bin/sh
for foo in 'hello world' 'yuna' 'rikku'
do
echo $foo
done
exit 0
foo会一个一个去取in后面的内容,然后把它们显示到屏幕上,我想这个很好理解
#!/bin/sh
for foo in `ls *.sh`
do
echo $foo
done
exit 0
这个我想也不难理解
明显缺陷出来了,对固定次数的循环for就有点麻烦了,比如你想循环打印hello 5次,写成
#!/bin/sh
for foo in 1 2 3 4 5
do
echo hello
done
exit 0
总是比较麻烦的。
while循环
语法是
while condition do
statements
done
很容易理解,给个简单的例子,循环打印hello world 10次
[root@liumengli my_shell]# cat while_shell.sh
#!/bin/sh
i=0
while [ $i -lt 10 ]
do
echo "hello world"
i=$(($i+1))
done
exit 0
until循环,和while 很像,就是条件成立时候退出循环,不成立进入循环体,和WHILE相反
[root@liumengli my_shell]# cat until_shell.sh
#!/bin/sh
read stat
until [ $stat = "hello" ]
do
read stat
done
exit 0
[root@liumengli my_shell]#