linux之shell编程(二)

今天给大家继续来分析linux下的shell编程,在上一篇文章简单的介绍了shell编程到底是什么,以及它的一些基本使用规则。我们今天主要来分享shell编程中的一些其他用法,比如说:条件语句,循环语句等;好了下面就开始我我们今天的内容了:

一、shell中的变量定义和引用:

1、变量定义和初始化:shell是弱类型语言(语言中的变量如果有明确的类型则属于强类型语言;变量没有明确类型就是弱类型语言),和C、C++语言不同。在shell编程中定义变量不需要制定类型,也没有类型这个概念。

2、变量定义时可以初始化,使用=进行初始化赋值。在shell中赋值的=两边是不能有空格的。同时要注意:shell对语法非常在意,非常严格。很多地方空格都是必须没有或者必须有,而且不能随意有没有空格。

3、变量赋值,变量定义后可以再次赋值,新的赋值会覆盖老的赋值。shell中并不刻意区分变量的定义和赋值,反正每个变量就是一个符号,这个符号的值就是最后一个给他赋值时的值。

4、变量引用。shell中引用一个变量必须使用linux之shell编程(二)符号就是变量解引用符号。基于上面的理论,我们现在来实战演示:

#!/bin/bash
   string="I love shell"
   echo $string

演示结果:

:/home/txp# source test.sh
  I love shell

这里同时也演示一下在变量定义的时候,不要有空格错误演示:

#!/bin/bash
  string ="I love shell"
  echo $string

演示结果,你将会看到下面这样的错误提示,虽然最终可以打印出来我们想要的结果,但是我们作为程序员一枚,自然是要做到—— 0 error , 0 warning

:/home/txp# source test.sh
  No command ‘string‘ found, did you mean:
  Command ‘strings‘ from package ‘binutils‘ (main)
  Command ‘strings‘ from package ‘binutils-multiarch‘ (main)
  Command ‘spring‘ from package ‘spring‘ (universe)
  string: command not found
  I love shell

扩展总结:

a、$符号后面跟一个字符串,这个字符串就会被当作变量去解析。如果这个字符串本身没有定义,执行时并不会报错,而是把这个变量解析为空。也就是说在shell中没有被定义的变量其实就相当于是一个定义并赋值为空的变量。

b、变量引用的时候可以linux之shell编程(二){var}。这两种的区别是在某些情况下只能用linux之shell编程(二)var。

c、还是主要在给变量赋值的时候不要在“=”与变量符号和所赋的值之间留空格,可能刚开始大家有点不习惯这种风格,比较在c和c++里面写代码,留空格,是一种代码风格,日后别人去看代码,看着也舒适;总之还是那句话,习惯了就好,毕竟规则是这么定的。

二、shell中调用linux命令:

有的时候,你不想输入太多的命令,可以在写一个shell脚本,把你要写的命令操作全部写进去,然后一键操作猛如虎,哈哈,于是乎,这里就出现了在shell脚本中使用命令两种目的:

1、直接执行:

这里我演示一下,我查看当前目录下有什么文件,我只要在shell脚本里面输入一个ls命令就行,具体看下面演示:

#!/bin/bash
ls

然后我们只要执行这个脚本文件就能实现我的功能了,这里只是简单的演示,有的时候写脚本对我们帮助非常大,可以提高我们的工作效率:

:/home/txp# source test.sh
1    2.c    Desktop    Downloads         fun.sh  hello.c         linux-2.6.35.7.tar.gz    Music     Public     Templates  test.sh  Videos
1.c  a.out  Documents  examples.desktop  h.c     linux-2.6.35.7  linux-2.6.35.7.tar.gz.1  Pictures  return.sh  test       test.sj  vmware-tools-distrib

2、反引号括起来执行。有时候我们在shell中调用linux命令是为了得到这个命令的返回值(结果值),这时候就适合用一对反引号(键盘上ESC按键下面的那个按键,和~在一个按键上)来调用执行命令:

#!/bin/bash
PWD=`pwd`
echo $PWD

这里演示的结果是使用pwd命令用于显示用户当前所处的工作目录:

:pwd# source test.sh
/home/txp

三、shell中的选择分支结构:

看到选择分支结构,大家应该都比较熟悉,第一反应就会想到if条件语句,没错就是它;在学习c、c++语言的时候,if条件语句对你来说简直小菜一碟,但是shell中的格式跟我们c、c++中的不一样,不过在掌握shell中的书写格式后,因为写法思想和之前的一样,只是说换了一种形式而已,俗话说的好:“换汤不换药”,同样对你来说是小菜一碟。

1、条件测试语句类型:

文件测试语句
逻辑测试语句
整数值比较语句
字符串比较语句

a、在这些语句中我们有的时候看别人脚本的时候,也经常会看到,因此我们必须掌握,日后也方便自己来写shell脚本,下面是文件测试中常见遇到的参数类型汇总:

操作符作用
-d测试文件是否为目录类型
-e测试文件是否存在
-f判断是否为一般文件
-r测试当前用户是否有权限读取
-w测试当前用户是否有权限写入
-x测试当前用户是否有执行权限执行

b、逻辑测试语符号(这个比较简单,对于我们做嵌入式的,在c语言里面就已经掌握了非常好了):

这里用的比较多是逻辑与:&&(它表示当前面的命令执行成功后才会执行它后面的命令)

还有一个就是逻辑或:||(表示当前面的命令执行失败后才会执行它后面的命令)

最后一种就是逻辑非:!(它表示把条件测试中的判断结果取相反值。也就是说,如果原本测试的结果是正确的,则将其变成错误的;原本测试错误的结果则将其变成正确的)

c、整数比较运算符汇总:

操作符作用
-eq是否等于
-ne是否不等于
-gt是否大于
-lt是否小于
-le是否等于或小于
-ge是否大于或等于

d、字符比较运算符汇总:

操作符作用
=比较字符串内容是否相同
!=比较字符串内容是否不同
-z判断字符串内容是否为空

2、if语句的三种格式书写:

a、单分支结构:

if 条件测试操作
   then  命令序列
fi

b、双分支结构:

if 条件测试操作
   then  命令序列1
   else  命令序列2
fi

c、多分支结构:

if 条件测试擦做1
   then 命令序列1
elif 条件测试操作2
   then 命令序列2
else
    命令序列3
fi

3、实战演示:

判断文件是否存在,不存在的话,就创建一个这样的文件:

#!/bin/bash
if [ -f a.c ]
   then echo "yes"
else
   echo "no"
   touch a.c
fi

演示结果:

:/home/txp# source test.sh
no
:/home/txp# ls
a.c

判断目录文件是否存在 ,这里我就以上面是否存在/hoem/txp这个目录类型的文件来演示了:

#!/bin/bash
[ -d /home/txp ]
echo $?

演示结果,这里注意通过Shell解释器的内设$?变量显示上一条命令执行后的返回值。如果返回值为0,则目录存在;如果返回值为非零的值,则意味着目录不存在:

:/home/txp# source test.sh
0

判断字符串是否相等:

#!/bin/bash
if [ "abc" = "abc" ]
   then  echo  "equal"
else
    echo "not equal"
fi

演示结果:

:/home/txp# source test.sh
equal

用"-o"来演示逻辑或的使用:

#!/bin/bash
if [ 12 -eq 12 -o "abc" = "abc" ]
   then  echo  "yes"
else
    echo "not"
fi

演示结果:

:/home/txp# source test.sh
yes

判断字符串是否为空:

#!/bin/bash
str=""
[ -z $str ] && echo "yes"

演示结果:

:/home/txp# source test.sh
yes

四、总结;

限于篇幅原因,暂时就没有写for和while等循环结构了,而且上面注意一个地方就是在往[]里面写判断语句的时候,注意左右两边要有空格,同时if语句的多分支结构我没有举例子,因为这和c语言里一样,只是说书写形式稍微有点不一样,下一篇文章继续分享。如果有想深入学习shell编程的网友,可以在公众台回复shell,就有两份shell电子书免费送给大家,希望对大家在学习上有帮助。

如果各位喜欢的我的文章,可以在下方点个在看(或者转发也行),你的支持,就是我写文分享最大的动力,感谢您的支持。不忘初心,方得始终。可以关注公众号----TXP嵌入式