linux之shell编程(二)
今天给大家继续来分析linux下的shell编程,在上一篇文章简单的介绍了shell编程到底是什么,以及它的一些基本使用规则。我们今天主要来分享shell编程中的一些其他用法,比如说:条件语句,循环语句等;好了下面就开始我我们今天的内容了:
一、shell中的变量定义和引用:
1、变量定义和初始化:shell是弱类型语言(语言中的变量如果有明确的类型则属于强类型语言;变量没有明确类型就是弱类型语言),和C、C++语言不同。在shell编程中定义变量不需要制定类型,也没有类型这个概念。
2、变量定义时可以初始化,使用=进行初始化赋值。在shell中赋值的=两边是不能有空格的。同时要注意:shell对语法非常在意,非常严格。很多地方空格都是必须没有或者必须有,而且不能随意有没有空格。
3、变量赋值,变量定义后可以再次赋值,新的赋值会覆盖老的赋值。shell中并不刻意区分变量的定义和赋值,反正每个变量就是一个符号,这个符号的值就是最后一个给他赋值时的值。
4、变量引用。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、变量引用的时候可以{var}。这两种的区别是在某些情况下只能用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嵌入式