零基础学习linux 第十五章 shell 编程(选学内容)

一、入门

什么是 shell?
首先打开一个终端,在终端里能做的操作, 如 cd ,cp 等
以及在终端里执行的命令,如 date,echo 等, 都能同样的写进.sh 脚本里面去,

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

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

#!/bin/bash 
cd /var/tmp/ 
pwd

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

第 3 步 执行,
./simple.sh

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

二、进阶

既然是 shell 编程,那么必然少不了变量,表达式,及控制结构这些.
分别讲解如下:
变量有三种:
1:自定义变量
2:系统变量
3:命令返回值变量
我们先来试一下自定义变量代码示例

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

此时,我们就声明了一个简单的变量.
注意:声明变量时,不要加,=,,,且'='号前后不要加空格, 而在引用变量时,则要加上,如 echo $var1
再来试一下系统变量文件名: sys.sh
代码示例

#!/bin/bash 
echo $HOME 
echo $USER

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

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

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

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

思考:命令的输出内容如何赋到变量里?
答:有时候,我们需要把命令的运行结果捕捉,并赋给某变量,则可以用反引号 命令 来实现. 如 pos=pwd,则 pwd 命令的结果将赋给 pos 变量.

三、提高

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

表达式有”命令表达式”,”数学表达式”,”字符串表达式”,”文件判断表达式”
控制结构有 if/ case/for/while
先来看一下命令表达式和 if/else 控制结构
命令表达式 是指 如果一个命令执行成功,则返回 true,如果执行失败,则执行 false if/else 的语法格式如下:

if 表达式
then
语句 1
语句 2
....
else
语句 one
语句 two
.....
fi

结合命令表达式,和 if 控制结构,我们创建一个脚本:com_exp.sh
作用:帮我们创建一个目录 dir1, 如果创建成功,则显示 ok;如果失败,则显示 fail.
代码示例:

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

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

数学比较表达式
数学比较表达式的作用: 比较两数的大小关系
数学表达式是这样的结构[ $var1 -gt/-lt/-eq/-ge/-le/-ne $var2 ]
注意:中括号两端各有 1 空格比较运算符的含义见下:
-gt >
-lt <
-ge >=
-le <=
-eq =
-ne !=

创建脚本 math.sh
作用:判断两个变量的大小,并打印结果. 代码示例:

#!/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

字符串判断表达式
字符串表达式的作用: 用于判断两字符串是否相同格式:

[ $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 目录代码示例

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

控制结构:
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 代码示例:

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

2:C 风格的 for 循环格式如下:
for((变量=初始值;变量<=n;变量++)) do
语句 1
语句 2

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

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

case 结构介绍
格式如下:
case 变量 in
可能性 1)
语句 1
语句 2
;;
可能性 2)
语句 1
语句 2
;;
*)
语句 1
语句 2
;;

创建脚本: case.sh
作用:判断当前登陆者是谁,并根据情况打印不同内容代码示例

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

几行语句后面,放两个;;就可以了, 而不是每行后面都放两个;;
*代表以上情况都不是时,类似于 java 中的 default

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章