Shell脚本编程(一)

1. 前言

前面我们学习了Linux相关的命令,接下来我们将进入真正的主题——shell脚步编程。
2. 直接执行命令
首先创建一个shell文件并用Vim编辑器打开
vim 01.sh

这时候已经进入命令模式,键盘点击i进入编辑模式,我们简单的输出当前时间和当前用户:
#!/bin/bash date who

第一行表示这是Shell中的bash,即Bourne Again Shell,Shell中的一种。我们按Esc退出编辑模式进入命令模式,再按shift + z z退出命令模式,这时候没有执行的权限,我们需要授予其执行的权限
chmod u+x 01.sh

最后命令行输入
./01.sh

执行后的结果为:
Thu Dec 21 18:07:25 CST 2017 rootpts/02017-12-21 16:27 (111.196.87.96)

3. 创建变量
#!/bin/bash n=10 s="I Love You" echo $n echo $s

这里的n和s都是变量,echo是输出命令,但是可以引号内部有空格,如果s=I Love You就会出错,因为中间有空格。此例输出结果为:
10 I Love You

还可以这样进行拼接
echo "$s very much"

输出结果为:
I Love You very much

这时候,有人就要问了,那我要怎样输出s,就可以这样:
echo "\$s"

4. 将命令的结果作为变量的值
curTime=`date` echo $curTime

其中**是键盘左上方波浪线下面的字符,**是键盘左上方波浪线下面的字符,``表示内部是命令,此例是将date命令的结果作为变量curTime的值了,输出结果为:
Thu Dec 21 19:44:51 CST 2017

除了这种做法,还可以:
curTime=$(date) echo $curTime

输出结果是完全一样的。
5. 输出重定向
将ls -la命令生成的结果输出到text文件中
ls -la > text

输入重定向
wc < text

将text文本中的内容输入,wc命令是输出文本的行数、单词数、字节数。
6. 数学运算
1. 基本整数运算
a=10 b=40 c=$(expr $b / $a) echo "c=$c"

输出结果为:
c=4

其中expr命令表示此处是数学运算,expr只能进行整数运算。此处的还可以这样表示:
d=$[$b / $a]

结果是一样的。
2. 浮点数运算 由于expr只支持整数运算,对于浮点数运算,我们需要用到bc命令
e=$(echo "scale=4; $a / $b" | bc) echo "e=$e"

这里bc是bc命令,scale是自带的内建变量,表示精确到小数点后几位,|是管道的意思,前面命令的输出结果作为后面命令的输入,此处命令行输出结果为:.2500
7. 内联输入重定向
f=$(bc << EOF scale=4 temp=($a * $b) temp / 4 EOF ) echo "f=$f"

输出结果为:100.0000
8. 命令执行退出的状态
0成功 127没有找到命令 1未知错误 126命令不可执行

查看上一次命令的执行状态
echo $?

在shell脚步中,自己指定退出的状态
exit 状态码

只有if命令的退出状态码为0,才会执行then部分
if命令 then 命令 fi

举个例子:
#!/bin/bash testuser=zhangpan if grep $testuser /usr then echo "ok" ls -a /usr/$testuser/ elif ls -d /usr/$testuser/ then echo "主目录存在" else echo "$testuser not exist" fi

9. test数值比较
test命令的复杂写法:
#!/bin/bash #test命令,如果条件成立,test命令以状态为0退出,if条件成立 if test $var then echo "test条件成立" else echo "test条件不成立" fi

test命令的简单写法:
#!/bin/bash a=10 b=5 #test命令的简单写法[] if [ $a -gt $b ] then echo "$a more than $b" else echo "$a smaller than $b" fi

10. test字符串比较
11.test文件比较
#!/bin/bash mydir=/usr/zhangpan #-d检查目录是否存在 if [ -d $mydir ] then echo "$mydir exist" ls $mydir else echo "$mydir not exist" fi

[ -d mydir :将/usr/zhangpan目录中的文件全部展示到控制台,当然也可以先转到目录下,再展示:
cd $mydir ls

其他的有关命令:
-d filename:如果filename为目录,则为真 -e filename:如果filename存在,则为真 -f filename:如果filename为常规文件,则为真 -r filename:如果filename可读,则为真 -w filename:如果filename可写,则为真 -x filename:如果filename可执行,则为真

12.多个条件
多个条件并列:
[] && []

例如:
#!/bin/bash #多个条件 mydir=/usr/zhangpan if [ -d $HOME ] && [ -w $mydir ] then cd $mydir touch text.c else echo "no such file" fi

13.任意数学表达式或赋值
任意数学表达式或赋值用双小括号
((数学表达式或赋值语句))

case命令
#!/bin/bash testusr=zhangpan case $testusr in jack) echo "$testusr is exist"; ; zhangpan) echo "$testusr is exist"; ; *) echo "no usr is exist"; ; esac

这个命令相信不用我做过多的介绍,大家就能明白其中的含义。
case命令的基本模式如下:
case var in pattern1) 命令1; ; pattern2) 命令2; ; *) 默认命令; ; esac

for循环
#!/bin/bash for item in Teacher Student Master do echo $item done

for命令的基本模式如下:
for var in list do 命令 done

如果集合中的元素有单引号或者双引号,可用转义符号进行转换,如双引号转义:
for item in Teacher\"s Student Master

集合可用list变量表示:
#!/bin/bash list="Teacher Student Master" for item in $list do echo $item done

上面集合的分隔符是空格,如果是逗号的话,需要用IFS字段分隔符:
#!/bin/bash list="Teacher,Student,Master" IFS=$, for item in $list do echo $item done

while循环
#!/bin/bash a=10 while [ $a -gt 5 ] do echo "$a" a=$[ $a - 1 ] done

【Shell脚本编程(一)】循环打印出10大于5的数,while循环的基本模式如下:
while test command do 命令 done

    推荐阅读