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
root     pts/0        2017-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

循环打印出10大于5的数,while循环的基本模式如下:

while test command
do
  命令
done

你可能感兴趣的:(Shell脚本编程(一))