姓名:张硕 学院:电子工程学院 学号:19020100006
转自:https://blog.csdn.net/qq_38612145/article/details/107544838
嵌牛导读:本文主要是对shell的介绍,以及shell的初识、shell程序的编写
嵌牛鼻子:shell、嵌入式
嵌牛提问:shell程序编写时的分支结构有哪些?
嵌牛正文:
shell初识
1. shell介绍
shell可以理解为软件系统提供给用户操作的命令行界面,是人机交互的一种方式
可以使用shell和操作系统、uboot等软件系统交互,但是存在缺陷,例如创建多个文件时,单独touch a.c需要输入多次,为了简便,可以把创建过程写成一个shell脚本程序,执行这个程序的效果和在命令行输入效果一样
shell是一类编程语言,又叫脚本语言。常见shell语言:**sh、bash、**csh、ksh、perl、python等。
脚本语言在嵌入式应用中,主要用来做配置,不会使用过于复杂的脚本语言特性
linux中最常用的脚本是bash
shell脚本的运行机制:解释运行
C语言编写过程为:编写出源代码,然后编译链接成可执行二进制程序,然后才能运行;而脚本程序不同,脚本程序编写好后源代码即可直接运行
shell程序是解释运行的,shell解析器会逐行的解释shell程序代码,然后一行行去运行
2. shell程序初识
shell程序是文本格式的,编辑器是文本编辑器就可以。因为shell要在Linux系统下运行,所以换行符必须为‘\n’,而windows下的换行符为"\r\n",因此windows中的编辑器写的shell不能在Linux下运行,选择在Linux下使用vi编辑器进行编写调试
不需要编译器
shell程序运行有三种方法
./xx.sh,要求程序必须有可执行权限
source xx.sh,source是一个Linux命令,脚本没有可执行权限也可以运行
bash xx.sh,bash是一个脚本解释器,本质上是一个可执行程序,xx.sh相当于传进去的参数
shell程序的第一行一般为:#!/bin/sh,以#!开头,后加上一个pathname,意思为指定shell程序被那个解释器执行。/bin/sh意思为这个脚本将被当前机器中/bin目录下的sh可执行程序执行
在Ubuntu中默认使用的解释器sh其实不是bash而是dash
脚本中的注释使用#,如果要多行注释,则每行前面都要加#
shell就是把以前命令行中输入执行的命令写成了程序,即为了避免反复在命令行下手工输入而设计的一中记录下手工输入步骤,然后通过执行shell脚本程序就能复述手工输入的过程。
3. shell程序编写
shell中的变量定义和引用
shell是弱类型语言(变量不用定义类型)
变量定义时可以初始化,使用=进行初始化,=的两边不能有空格;变量定义后可以使用=进行赋值
shell对语法非常严格,很多地方空格都是必须没有或者必须有,不能随意添加
变量引用。shell中引用变量需要在变量前加$符号,$符号就是变量解引用符号,$符号后面跟一个字符串,如果字符串本身没有定义,执行时也不会报错;变量引用的时候可以$var,也可以${var}。
shell中使用字符串可以不加双引号,但是不能输出''等其他转义字符,转义字符需要在前加\,例如:\$、 \'等
shell中调用Linux命令
直接使用Linux命令来执行
反引号括起来执行。有时候在shell中调用Linux命令是为了得到这个命令的返回值,这时候就需要用到一对反引号``来调用执行命令
分支结构
shell的if语句用法很多
典型if语言格式
if [表达式]; then
xxx
xxx
else
xxx
xxx
fi
if的典型应用
判断文件是否存在(-f)
if [ -f a.txt ];then
xxx
注意[]里面前后都有空格,不能省略
判断文件夹是否存在(-d)
判断字符串是否相等(“str1“=”str2")。注意用一个等号而不是两个等号
判断数字是否相等(-eq)、大于(-gt)、小于(-lt)、大于等于(-ge)、小于等于(-le)
判断字符串是否为空(-z)。**注意-z判断时如果变量本身没有定义不等于为空
if判断式中使用-o表示逻辑或
逻辑或||和逻辑与&&在简写if表达式中
[ -z $str] && $str="1"
如果str变量为空,则赋值为“1”
如果str变量不为空,则不进行后面的赋值
[ -z $str] || echo "feikong"
如果str变量为空,则不执行后面的语句
如果str变量不为空,则打印“feikong”
循环结构
for循环
for i in 1 2 3 4
do
ehcho $i
done
不同于C语言,for循环中没有大括号{ }
while循环
i=1
j=11
while [ $i -l $j]
do
echo $i
i=$(($i + 1)) #i++
done
=两边不能有空格,i++的写法中有两层括号
shell中值得关注的知识点
echo的创建和追加输入文件
在shell中可以直接使用echo创建文件,并将内容写入文件中
echo "test" > a.txt
>符号为创建文件
echo "test" >> a.txt
>>符号为向已存在文件末尾追加内容
case语句
shell中的case语句和C语言中的switch case语句功能一样,格式不一样
var=2
case $var in
1) echo "1";;
2) echo "2";;
esac
shell中的case语句没有break,默认带有break。两个;作为结尾符,1)为var的结果
shell程序的传参
shell程序本身也可以在调用时传参
$#表示调用该shell时传参的个数。($#计数时只考虑真正的参数个数)
$0是执行这个shell程序的解析器的名字
$1是第一个有效参数的值
$2是第二个有效参数的值…
while循环和case语句以及传参的结合
shell中的break关键字和C语言中意义不同,因为shell中的case语句默认带着break,而break关键字的出现只用于循环跳出。所以在while中内嵌case语句时,出现的break是为了跳出while循环。
shell中内置变量$1 、$2等的值可以被shift指令改变。shift指令类似于左移运算符,会把shell的传参向左移除一个,则原来的$2变成了$1,$#也会减少一个。