linux快速掌握第十六章 shell 编程(选学内容)

入门

什么是 shell?

首先打开一个终端,在终端里能做的操作, 如 cd ,cp 等

以及在终端里执行的命令,如 date,echo 等, 都能同样的写进.sh 脚本里面去,

此时,你可以把脚本文件理解成一个”命令包”, 运行一个文件相当于运行了里面的多个操作和命令. (参照 windows 下的.bat 文件来理解)

那么让我们来做一个最简单的.sh 文件文件名: simple.sh

代码示例

<code>#!/bin/bash 
cd /var/tmp/
pwd/<code>

第 2 步,

加上执行权限, chmod u+x simple.sh

(脚本编辑完成后,需要加”可执行权限”这一步,在下面的脚本示例中,就不再重复写了,请大家自己加)

第 3 步

执行, ./simple.sh

看看打印什么?(和在终端直接执行 cd /var/tmp , pwd 两个命令的效果是一样的)

进阶

既然是 shell 编程,那么必然少不了变量,表达式,及控制结构这些.

分别讲解如下:

变量有三种:

1:自定义变量

2:系统变量

3:命令返回值变量

我们先来试一下自定义变量代码示例

<code>#!/bin/bash 
var1=hello
var2=bash
#注意,=号两边都不要有空格
echo $var1 $var2/<code>

注意:声明变量时,不要加$,且'='号前后不要加空格, 而在引用变量时,则要加上$,如 echo $var1

再来试一下系统变量文件名: sys.sh

代码示例

<code>#!/bin/bash 
echo $HOME
echo $USER/<code>

运行 sys.sh 查看结果?

对于$HOME,$USER,我们并没有定义这两个变量,但为什么可以打印出结果呢? 这是因为$HOME,$USER 是系统变量,系统已经定义好了,不用我们再定义.

最后来试一下命令返回值变量脚本: com.sh

代码示例

<code>#!/bin/bash
var1=`date +%y%m%d`
echo $var1
date +%y%m%d/<code>

运行 ./com.sh, 看看打印结果? 分析一下两行的结果各是怎么样打印出来的?

思考:命令的输出内容如何赋到变量里?

答:有时候,我们需要把命令的运行结果捕捉,并赋给某变量,则可以用反引号 `命令` 来实现. 如 pos=`pwd`,则 pwd 命令的结果将赋给 pos 变量.

提高

会定义变量,会使用系统变量,会捕捉命令的返回值,还不够, 有了变量,还要有表达式和控制结构,才能叫”程序”

表达式有”命令表达式”,”数学表达式”,”字符串表达式”,”文件判断表达式”

控制结构有 if/ case/for/while

先来看一下命令表达式和 if/else 控制结构

命令表达式 是指 如果一个命令执行成功,则返回 true,如果执行失败,则执行 false if/else 的语法格式如下:

<code>f 表达式
then
语句 1
语句 2
....
else
语句 one
语句 two
.....
fi/<code>

结合命令表达式,和 if 控制结构,我们创建一个脚本:com_exp.sh

作用:帮我们创建一个目录 dir1, 如果创建成功,则显示 ok;如果失败,则显示 fail.

代码示例:

<code>#!/bin/bash 
if mkdir dir1
then
echo ok
else
echo fail
fi/<code>

先保证当前目录下没有 dir1 目录,然后运行 2 次此脚本,看看分别打印什么结果,并思考为什么?

数学比较表达式

数学比较表达式的作用: 比较两数的大小关系

数学表达式是这样的结构[ $var1 -gt/-lt/-eq/-ge/-le/-ne $var2 ]

注意:中括号两端各有 1 空格比较运算符的含义见下:

-gt >

-lt <

-ge >=

-le <=

-eq =

-ne !=

创建脚本 math.sh

作用:判断两个变量的大小,并打印结果. 代码示例:

<code>#!/bin/bash 
var1=8
var2=12
if [ $var1 -gt $var2 ]
then
echo $var1 more than $var2
elif [ $var1 -eq $var2 ]
then
echo $var1 equal $var2 else
echo $var1 less than $var2
fi/<code>

字符串判断表达式

字符串表达式的作用: 用于判断两字符串是否相同格式:[ $str1 =/!= str2 ]

注意:中括号两端各有 1 空格代码示例

#!/bin/bash

var1=hello

var2=world

if [ $var1 = $var2 ]

then

echo $var1 is $var2

else

echo $var1 is not $var2

文件判断表达式

文件表达式作用:判断文件是否存在,是否可读/可写/可执行,是否是目录或普通文件等, 以及用来比较两个文件的新旧顺序.

格式 1: [ -d/-f/-e/-r/-w/-x filename ]

分别判断

-d 文件是否存在且是目录

-f 文件是否存在且是文件

-e 是否存在

-r 是否可读

-w 是否可写

-x 是否可执行

格式 2: [ file1 -nt/-ot file2 ]

分别判断

-nt 检查 file1 是否为 file2 新

-ot 检查 file1 是否为 file2 旧

创建脚本: file.sh

作用:判断当前目录下有没有 dir2

目录代码示例:

<code>#!/bin/bash 
if [ -d ./dir2 ]
then
ls dir2
else
echo dir2 is not exists
fi/<code>

控制结构:

if/else 结构(上面有很多例子,跳过)

for 结构 (for 循环有两种)

1: bash 风格的 for 循环格式如下:

for 变量名 in 值 1 值 2 值 3 值 n

do

语句 1

语句 2

....

done

创建脚本 bash_for.sh 作用: 打印 A B C D E 代码示例:

<code>#!/bin/bash
for i in A B C D E
do
echo $i

done/<code>

2:C 风格的 for 循环格式如下:

for((变量=初始值;变量<=n;变量++)) do

语句 1

语句 2

...

done

创建脚本:c_bash.sh 作用:计算 1-100 的和代码示例:

<code>#!/bin/bash
for((i=1;i<=100;i++))
sum=0
do
sum=$[ $sum + $i ]
done
echo $sum/<code>

case 结构介绍

格式如下:

case 变量 in

可能性 1)

语句 1

语句 2

;;

可能性 2)

语句 1

语句 2

;;

*)

语句 1

语句 2

;;

创建脚本: case.sh

作用:判断当前登陆者是谁,并根据情况打印不同内容

代码示例

<code>#!/bin/bash 
case $USER in shiba)
echo -n “you “
echo -n “are “
echo “shiba”;; shijiu)
echo you are shijiu*)
echo sorry!/<code>

几行语句后面,放两个;;就可以了, 而不是每行后面都放两个;;

*代表以上情况都不是时,类似于 java 中的 default


分享到:


相關文章: