Shell脚本语法篇
一:条件测试
1:条件测试:命令test或者是 [ 但是 [ 通常与 ] 一起是使用
我们再来看看结果:
要分析这种现象必须的明确几个概念,在Shell中,一切都是指令,而test和[是起到条件判断的作用,在C语言中我们会根据返回值来判断条件语句是否成立,在Shell中我们是根据退出来判断条件语句的成立与否,这点和进程和线程十分相像,通常我们规定正常退出退出码为0(条件为真),否则(条件为假)退出码为其他整数.
我们观察到右几个特殊的符号好像起到判断额作用,我们来揭秘,
-lt表示小于(little)
-gt表示大于(great)
-le表示小于等于(little and equle)
-ge表示大于等于(great and equle)
那么$?一般表示最新的退出码
为了方便记忆,我们一般去其英文单词的首字母,这样就不会弄混了.
当然如果我们不知道该目录下文件的类型,我们也可以用条件语句去测试,常见的文件类型有-b块设备,-p管道等等,有兴趣的小伙伴可以自己去测试一下.
2:与C语言类似可以做与,或,非的逻辑运算.
结果:
和C语言类似,!表示非,&&或者 -a(and)都表示与,表明两个条件为真才为真,退出码为1表示条件不成立.-o(other)或者||表示或的关系,至少有一个成立.
3:分支语句
if/then/elif/else/fi和C语言很类似,elif表示else if语句.fi表示条件终止
结果:
我们看到一个奇怪的字符冒号 : 在Shell脚本中表示条件一直为真,这样,如果在某些条件下写死循环,可以这样写if : 注意Shell脚本中一切皆命令,带空格表示命令,不带空格,表示是前面命令的参数.
4:cast语句
在C语言中我们还有一种语句表示分支就是switch case,那Shell脚本中如何写呢?
我们以一个例子来分析:
结果:
我们发现.Shell脚本下case语句和C语言的格式还是一样的,只是这里面都是用指令替代了某些语句,比如beak脚本下用;;,default用*)表示,当然case语句结束用esac来标识,刚好反过来.
当然有对脚本感兴趣的小伙伴还可以进入
/ect/init.d的文件下查看
case语句的其他用法
二:循环语句:
我们先看for循环和while循环:前面我们也知道(())在内括号里面可以进行表达式的运算和C语言类似
第一种:类C的写法:
for/do/done
第二种:for in/do/done
第三种:untile循环.类似C语言的do..while循环
第三种:while/do/done
三:Shell脚本位置参数和特殊变量
如下的栗子:
输出结果:
我们发现
$# 相当于C语⾔言main函数的argc - 1,注意这⾥里的#后⾯面不表⽰示注释
四:函数:
和C语言类似,Shell中也有函数的概念,但是函数定义中没有返回值也没有参数列表,函数体左花括号{},如果将最后一条命令和花括号}写在同一行,命令末尾必须有:号
格式如下:
当然有的时候我们不用加function来标识.
可能大家会觉得奇怪在,C语言中我们可以给函数传参数,那么Shell脚本中如何传参数呢?
我们想到了命令行参数
fun 1 ‘string’ 3.14
结果:
我们知道Shell是弱类型的,因此可以在参数中输出其他的类型.
函数返回值:
一定也区分清:retuen 和echo的区别,前一个表示是退出码,后一个表示输出结果.
五:函数调试:
我们知道在windows下我们可以用监视窗口来调试,在Linux下我们也可以用GDB,那么Shell脚本如何调试呢?
我们有一下的方法:
一:是在命令行提供参数
$sh-x./1.sh
二:是在脚本开头提供参数
#!/bin/sh-x
第三种方法是在脚本中用set命令启用或禁用参数
set-x和set+x分别表示1和禁用-x参数,这样可以只对脚本中的某一段进行跟踪调试
我们以第二种方式为例:
如下:每次执行,都会打印执行的过程
六:数组
Shell脚本支持以为数组,并没有相纸数组的大小,与C语言类似,数组元素小标也是从0开始,获取数组的元素要利用下标,下标可以是是整数或算数表达式,其值应大于或等于0.
定义数组的格式:
arr=(val1…valn)
记住元素之间用”空格”符号分割开.
读取数组元素值的一般格式是:
${arr[index]}
使用@或*可以获取数组中的所有元素,例如:
结果:
关于Shell脚本的语法学习先总结到这,当然还有其他的下次再说.
上一篇: leetcode[198]:House Robber
下一篇: Linux进程信号探究