weiqi7777

Linux shell 学习

0
阅读(1871)

    在学习ubootmakefile的时候,发现有很多东西看不懂,因为包含了很多linux shell的一些知识,本着什么不会,就学什么,所以先来学习一下linux shell

 


参考的是网易云课堂的北大青鸟的linux shell视频教程。

 


1、  Shell命令的组合使用

三种

&&  逻辑与

使用:

         命令1 && 命令2  

当命令1执行成功后,再执行命令2,如果命令1执行不成功,那么命令2不执行

image

第一个,cd 命令执行成功,所以echo 命令也执行,有输出

第二个,cd命令执行不成功,所以echo命令不执行,没有输出

 


 

||     逻辑或

使用:

         命令1 || 命令2

当命令1执行成功勾,不执行命令2,只有命令1执行不成功,才执行命令2

image

第一个,cd 命令执行成功,所以echo 命令不执行,没有输出

第二个,cd命令执行不成功,所以echo命令执行,有输出

 


 


 ;      顺序执行

使用:

         命令1 命令2 ….. ;命令n

按照顺序,依次执行命令1,命令2…..命令n

image

首先执行cd命令,然后再执行pwd命令。

 


2、  使用变量

Shell和其他语言一样,可以使用变量,不过变量是没有类型的。而且使用的时候,需要在前面加$符号。即$变量,也可以用${变量}来引用这个变量。

  var = “hello world”(申明变量,注意等号两边不能有空格,不然会把var认为是命令)

使用var变量的话,就要用$var,或者是${var}

image

第一个设定var变量,值为字符串hello world

第二个使用echo打印变量的值。

第三个也是使用echo打印变量的值

 


下面两个地方要注意:

双引号:

           使用双引号的字符串,是允许引用以及 \转义的

单引号:

           使用单引号的字符串,不允许禁止使用,\转义的

image

第一个是在””中引用变量,变量会替换的

第二个是在’’中引用变量,这个时候变量是不会替换的。

 


 


反撇号,或者$()

           以命令输出进行替换

image

第一个使用反撇号`命令`,命令的输出就会赋值给var变量

第二个使用$(命令),命令的输出也会赋值给var变量

 


有以下几个变量比较特殊:

$?   :前一条命令执行状态值,0表示正常执行,非0表示执行异常

$0      :脚本自身程序

$1-$9 :执行脚本输入的第一个到第九个位置参数

$*      命令行的所有位置参数的内容

$#      命令行的位置参数个数

image

Bash代码,测试特殊的几个变量

image

执行,代码就可以看到结果。

$0表示执行的命令

$1$2表示输入的第一个和第二个参数

$#表示输入的参数个数,这里是有2

$*表示输入的参数的内容,这里有两个参数,所以内容就是  hello world

 


3、  数值运算及处理

使用expr命令,计算表达式

格式:

           expr 数值1 操作符  数值2

操作符包括 +  -  *  /  %,和其他语言是一样的。但是要注意的是,使用*的时候,要使用转义字符, \*  

image 

使用也比较简单,就是注意*要有转义,不然就会报错

 


        

 


使用$[] ,进行算数替换

           $[数值1  操作符 数值2]

操作符包括 +  -  *  /  %,和其他语言是一样的。这里,*是不要转义的。

 


 


 


可以使用let让变量自加和自减

格式:

           let 变量++    let 变量--   let 变量+=n

image

也比较简单,和c语言的运算简写赋值一样

 

 


 


产生随机数,使用RANDOM变量

image

第一个产生一个随机数,范围是 0 – 32767

第二个产生一个100以内的随机数

 


生成数字序列

  使用seq 生成数据序列

格式

        seq  首数  末数       seq 首数 增量 末数

没有首数的话,默认是从1开始的。

image

第一个产生从1开始到5的序列

第二个产生从3开始,增量是2,末数不超过10的序列

第三个产生从35,以1为增量的序列

 


 


小数运算

   通过管道,使用bc命令

image

不过小数处理在bash里面,应该用得比较少的。

 


4、  字符串处理

路径分割

           当需要把路径和文件分割开,可以使用dirname命令和basename命令

这样,就可以得到路径和文件名

 


字符串截取

         使用expr命令

                   expr  substr  变量  起始位置   截取位置

                                                                 编号从1开始,这个要注意

 


         使用${}表达式

                   ${变量:起始位置:截取长度}

                                     编号从0开始

 


 


 


5、  条件测试

[条件表达式]

image

检测 /etc是否是一个目录,是的话打印YES

对于[]要注意,在每个组件之间都要有空格

 


-d:是否为目录

-f:是否为文件

-e:目标是否存在

-r: 是否有读取权限

-w:是否有写权限

-x:是否有执行权限

 


还可以判断变量是否存在

image

如果变量sasda不存在,那么”${sadsa}”就为空,-z是为空判断,那么第一个测试通过,所以第二个命令不执行

如果变量sadsa存在,那么”${sadsa}”就不为空,第一个测试不通过,所以就要执行第二个命令。

整数值比较,有以下操作符

-eq:           等于

-ne:           不等于

-gt:            大于

-lt:             小于

-ge:           大于或等于

-le:             小于或等于

image

第一个测试通过,所以命令2执行

第二个测试不通过,所以命令2不执行

 


字符串匹配

         使用 =  !=

image

 


6、使用if判断语句

 


         单分支if语句结构

         if 条件测试

                   then 命令序列

         fi(表示条件判断结束)

 


 


         双分支if语句结构

         if 条件测试

                   then 命令序列1

                   else  命令序列2

    fi

 


 


         多分支if结构

         if 条件测试

                   then 命令序列1

         elif 条件测试2

                   then 命令序列2

         。。。

         else

                   命令序列n

         fi

7、使用for循环

         语法

                   for 变量名 in 取值列表

                   do

                                     命令序列

                   done        

 


 


8、使用case分支

Case 变量值 in

模式1)

         命令序列1

模式2)

         命令序列2

。。。。。。

*

         默认命令序列

         esac