当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 学习笔记 > 嵌入式学习笔记:shell脚本学习从入门到精通

嵌入式学习笔记:shell脚本学习从入门到精通 时间:2018-09-12      来源:未知

shell脚本会了吗,不会的看这里,教你一一来学,还有实例哦

1.shell脚本

定义:多条命令按顺序执行,就是shell脚本

例如:vim hello.sh

两种执行的方式:

1.直接执行:bash hello.sh

2.给当前用户或所有用户加上可执行权限,再执行:./hello.sh

chmod u+x hello.sh //对当前用户增加执行权限

1.2 shell变量

1.2.1. 赋值:变量名=值

(1) 变量不用定义,直接赋值即可, 赋值时,赋值号前后不能有空格

(2) 赋值给变量的数据当字符串处理

注意:shell里边变量名提议用大写的

例子:DATE=`date`

1.2.2. 取值

$变量名或${变量名}

注意:取变量值的时候,需要给美金符号($)

1.2.3. 删除变量值:unset 变量名

例子:unset DATE

实例:给IFPO赋值一个命令, 然后echo输出命令

1.3命令行参数变量

命令行:脚本启动时,shell程序会自动赋值,在脚本中可以直接取值:

$0 脚本名

$1 - $9 脚本参数

$* 所有的命令行参数

$# 命令行参数个数

$? 前一个命令的结果

$$ 当前shell脚本进程ID

0 正常退出 //这里可以判断一下ls -l +文件名存在的时候,执行完之后的结果

1 异常退出 //这里可以判断一下ls -l +文件名不存在的时候,执行完之后的结果

同样可以有参数:

实例:

1.4系统环境变量

系统shell赋值的变量,shell脚本中可以直接使用:

$PATH 执行命令时,未指定命令的绝对路径,从此变量指定的路径中搜索

$HOME 指定用户主目录:/home/ubuntu

追加环境变量路径:

导出环境变量:在子处调用父中变量

补充:注释:以#打头的行

1.5 read

用处:读取一行用户输入

read VAR(定义变量)

echo $VAR(输出变量值)

实例:

补充:指定脚本解析器:#!/bin/bash

echo $SHELL:查看当前自己环境用的bash

1.6算术计算命令(expr.sh)

expr 数学表达式

数学表达式中支持的运算符:+, -, \* , /, %

注意:乘法(因为*有特殊含义,需要转义)

实例:

注意:运算符前后都有空格,不加空格,会把我们的值理解成字符串

等号前后不需要空格

补充:其他算法

(1)let

例如:var=1

let "var+=1"

echo $var

注意:a)经测试let几乎支持所有的运算符,在网上看到一篇文章说“let不支持++、--和逗号、(、)”,但经测试自加、自减、以及括号的优先级都得到了很好的支持

b)方幂运算应使用“**”

c)参数在表达式中直接访问,不必加$

d)一般情况下算数表达式可以不加双引号,但是若表达式中有bash中的关键字则需加上

e)let后的表达式只能进行整数运算

(2)使用(())

var=1

((var+=1))

echo $var

输出结果为2

注意:(())的使用方法与let完全相同

(3)使用$[]

var=1

var=$[$var+1]

echo $var

输出结果位2

注意:a)$[]将中括号内的表达式作为数学运算先计算结果再输出

b)对$[]中的变量进行访问时前面需要加$

c)$[]支持的运算符与let相同,但也只支持整数运算

(4)使用expr

var=1

var=`expr $var + 1`

echo $var

输出结果为2

注意:a)expr后的表达式个符号间需用空格隔开

b)expr支持的操作符有: |、&、<、<=、=、!=、>=、>、+、-、*、/、%

c)expr支持的操作符中所在使用时需用\进行转义的有:|、&、<、<=、>=、>*

e)expr同样只支持整数运算

1.7测试命令

test 表达式

等价于:[ 表达式 ]

注意: [ 后面一定要有空格, ] 前面一定要有空格

test命令没有输出, 只有程序退出状态

表达式(注意: 运算符合操作数之间有空格):

1. 字符串比较

str1 = str2 相等(注意空格)

str1 != str2 不等

-z str 为空

-n str 不空

2. 整数比较

a -eq b 相等

-ne 不相等

-ge 大于等于

-le 小于等于

-gt 大于

-lt 小于

3. 文件测试

-d file 目录? (file即为要测试的文件)

-e file 存在文件或目录?

-f file 普通文件?

-r file 存在可读?

-w file 存在可写?

-x file 存在可执行?

-s file 存在长度不为0

f1 -nt f2 f1 比 f2新?

f1 -ot f2 f1 比 f2旧?

4. 逻辑运算

a -a b 且

a -o b 或

注意;0表示真 1表示假

测试语句:echo $? //输出上一次的返回结果

实例

 

1.8 if语句

1.8.1. if

语法

if [命令1] 相当于if()

then {

命令列表 语句

fi }

执行流程:(1) 执行 命令1

(2) 如果为真($? 为 0), 执行 命令列表

5.8.2 if ... else

语法

if 命令1

then

命令列表1

else

命令列表2

fi

执行流程:(1) 执行 命令1

(2) 如果为真($? 为 0), 执行命令列表1

如果为假, 执行命令列表2

1.8.3 if ...elif...elif...

语法

if 命令1

then

命令列表1

elif 命令2

then

命令列表2

else

命令列表*

fi

执行流程:(1) 执行 命令1

(2) 如果为真, 执行 命令列表1

(3) 如果为假, 执行 命令2

(4) 如果为真, 执行 命令列表2

如果为假, 命令列表*

实例:

1.9 case语句

1.9.1语法

case 值(结果为字符串的表达式或变量) in

模式1)(类似于通配符)

命令

;;(类似于break)

模式2)

命令

...

;;

*)//默认模式

命令

...

;;

Esac

注意:模式可以包含 *, ?, [...]等文件名匹配模式(模式就是正则表达式)

例如:y | yes | Y | Yes)

实例:

 

1.10 while

1.10.1 语法

while [ 关系表达式 ]

do

命令列表

done

1.10.2 流程

(1) 执行 [ 关系表达式 ]

(2) 结果为真, 执行 命令列表后,再执行(1)

假 结束 while语句

实例:

1.11 continue

1.11.1语法

continue n

n 为整数

1.11.2 执行流程

结束n层的本次循环

实例:计算奇数和

 

1.12 for

1.12.1. 语法

for 变量 in 字符串列表

do

命令列表

done

注意:in 后面到列表省略,表示使用脚本参数做为字符串列表

1.12.2 执行流程

变量按顺序取字符串列表中到值,每个值执行一次命令列表

实例:

 

1.13 break

1.13.1 语法

break n(n 为整数)

1.13.2 执行流程

结束n层循环

实例:

 

1.14 函数

1.14.1 定义

function 函数名()

{

local 变量赋值

命令列表

...

return 值

}

注意:function 关键字可以没有,但是函数名()必须有

函数可以用$0 - $9的变量,从函数外获取值

return 命令可以返回值给$?变量

local申明的变量作用范围为函数内部

2. 调用

OUT=`function_name 参数1 参数2`

function_name 参数1 参数2

定义在前,调用在后,且必须在同一个脚本中

OUT变量可以获取到函数的输出

实例:

 

注意:在文件系统中,禁止将自己的目录下的所有文件拷贝到自己目录下的某个文件

上一篇:嵌入式学习笔记:linux软件包安装程序介绍

下一篇:嵌入式学习笔记:C高级函数快速学

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部