嵌入式入门学习笔记,遇到的问题以及心得体会!
DAY13
概述:
1.shell脚本(编程)
2.shell和shell脚本
3.shell的分类
4.脚本的书写步骤
5.shell编程的步骤
6.shell的基本语法
7.shell程序和语句
笔记:
1,shell脚本(编程)
编程:编译型(gcc) 和 解释型(bash)
2,shell和shell脚本?
—》
shell :命令行解释器
shell脚本:shell命令的有序集合
3,shell的分类:
(1)sh:首发版本,不含有Tab,上下键历史命令,通配符…
(2)csh:编程风格类似于C,但是不够健壮
(3)ksh:需要许可证
(4)bash:是sh的增强版本,sh不支持bash均支持----》要学习的
4,脚本的书写步骤
(1)首先:顶格书写:#! /bin/bash —>注意:这里的#!是告诉编译器该脚本交由哪个解释器来进行翻译执行
(2)剩下的语句就按照shell脚本的语法格式书写即可!
5,shell编程的步骤
(1)新建一个后缀名为.sh的文件 ----》vim test.sh
(2)修改该.sh文件的权限为可执行-----》chmod u+x test.sh
(3)直接运行该文件即可 ----》./test.sh
如果想直接test.sh也能够运行出来结果:
有两种方式:
(1)临时性修改
—》在当前终端:export PATH=当前该文件的绝对路径:
P
A
T
H
当
换
个
终
端
就
不
会
识
别
!
(
2
)
永
久
性
修
改
−
−
−
》
在
配
置
文
件
:
v
i
m
/
.
b
a
s
h
r
c
−
−
−
》
e
x
p
o
r
t
P
A
T
H
=
当
前
该
文
件
的
绝
对
路
径
:
PATH 当换个终端就不会识别! (2)永久性修改 ---》在配置文件:vim ~/.bashrc ---》export PATH=当前该文件的绝对路径:
PATH当换个终端就不会识别!(2)永久性修改−−−》在配置文件:vim /.bashrc−−−》exportPATH=当前该文件的绝对路径:PATH,保存退出
这个时候无论在哪个终端哪个位置都可以运行出来结果
--------------------------------------------------------------------------------
6,shell的基本语法:
shell中的4中变量:
(1)用户自定义变量
(2)位置参数(命令行参数)
(3)预定义变量
(4)环境变量
(1)用户自定义变量
shell允许用户来进行自定义变量,但是在shell中被赋值的变量都会按照字符串进行处理
如何定义变量?
格式:
变量名 —>一般大写
如何给变量进行赋值:
格式:
变量名=值
如何引用该变量的值:
$变量名 即可!
一般通过echo $变量名 进行输出
注意:当变量名和其他字符进行混淆的时候。加上{}即可!=–》eg:echo This is the ${NAME}nd!
(2),位置参数(命令行参数)
规则:可以通过$N 来访问每一个参数
注意:和数组很类似:–》$0–>文件名 从$1开始才是传进来的有效参数
(3),预定义变量
由系统预先定义好的一些变量,这些变量具有特定的含义,一般是由$和另外一个字母组成
常用的预定义变量如下:
$#:代表命令行参数的个数(不包含文件名在内)
$@:代表所有的命令行参数(不包含文件名在内)
$*:代表所有的命令行参数(不包含文件名在内)
$?:代表上衣程序返回的状态(退出状态)–》若正常退出为0,否则为非0
(4),环境变量:用于所有的用户进程
添加环境变量:export —》eg: export WANGJIA=“Actor”
清除环境变量:unset —> eg: unset WANGJIA
显示所有环境变量:env —》eg: 输入env 即可显示所有的环境变量
7,shell程序和语句
shell程序:由零条或者多条shell语句构成:shell语句可以分类:
(1)说明性语句:以#开头的语句
(2)功能性语句:任意的shell命令
(3)结构性语句:分支语句和循环控制语句
一、功能性语句:任意的shell命令
(1)如何动态获取变量的值:
————-》通过 read来进行获取 —》 read 变量名
注意:如果想要打印出提示信息:
可以通过:
1,echo “提示信息” (自动换行)
2.read -p “提示信息” 变量名
(2)通配符的转义:
第一:单引号:硬转义–》会关闭掉内部所有的shell元字符以及通配符的含义
第二:双引号:软转义–》会保留内部的所有shell元字符以及通配符的含义
第三:\转义: 转义字符:\t \b \n ----》会去掉紧跟着的shell元字符的含义
eg:
read -p "请输入一个姓名:" NAME
echo Nice to meet you,${NAME} //oK
echo 'Nice to meet you,${NAME}' //error
echo "Nice to meet you,${NAME}" //oK
echo Nice to meet you,\${NAME} //error
(3)expr命令:算术运算命令:+ - * / %
注意:在使用expr命令时:
(1)运算命令即:+ - * / %前后要有空格
(2)反引号``和等号之间也不能有空格
(3)expr命令本身就是一个带计算结果的,如果想要将其结果赋值给另外一个变量,则需要用到命令置换方可!
案例:实现输入两个数,完成+ - * / %的功能
#! /bin/bash
#动态获取两个数字
read -p "请输入两个数字: " num1 num2
add=`expr ${num1} + ${num2}`
sub=`expr ${num1} - ${num2}`
#mul=`expr ${num1} '*' ${num2}`
mul=`expr ${num1} \* ${num2}`
div=`expr ${num1} / ${num2}`
mol=`expr ${num1} % ${num2}`
echo "$num1 + $num2 = ${add}"
echo "$num1 - $num2 = ${sub}"
echo "$num1 * $num2 = ${mul}"
echo "$num1 / $num2 = ${div}"
echo "$num1 % $num2 = ${mol}"
(4)test命令–》测试命令
测试对象:字符串 整数 文件属性
注意:对于test命令:
结果:
当测试为真时,结果为0,反之则为非0
各种测试对象都有若干个测试操作符:
1,如何测试字符串:
假设以str1 和 str2为例:
str1 = str2 -->测试两个字符串是否相等
str1 != str2 -->测试两个字符串是否不相等
-z str1 —>测str1这个字符串的长度是否为0
-n str2 —>测str2这个字符串的长度是否不为0
2,如何测试整数
假设以num1 和num2为例:
num1 -eq num2 —>相等
num1 -ne num2 —>不相等
num1 -gt num2 —>测试num1是否大于num2
num1 -lt num2 -->测试num1是否小于num2
num1 -ge num2 —>测试num1是否大于等于num2
num1 -le num2 —>测试num1是否小于等于num2
3,如何测试文件属性
假设文件为f1和f2
-d f1 ---->测试文件f1文件是否为目录文件
-f f1 —>测试文件f1文件是否为普通文件
-L f1 —>测试文件f1文件是否为链接文件
-r f1 ---->测试文件f1文件是否存在且可读
-w f1 ---->测试文件f1文件是否存在且可写
-x f1 ---->测试文件f1文件是否存在且可执行、
-s f1 —>测试文件f1是否存在且长度不为0
f1 -nt f2 ---->测试f1是否比f2更新
f1 -ot f2 ---->测试文件f1是否比文件f2更旧
二、结构性语句
分支语句:
单分支:
格式:
if 表达式
then
语句块
fi
双分支:
if 表达式
then
语句块1
else
语句块2
fi
对路分支:
if 表达式1
then
语句块1
elif 表达式2
then
语句块2
。。。。
else
语句块N
fi
对于多路分支case语句:
case 字符串常量 in
模式1)
语句块1
;;
模式2)
语句块2
;;
…
*)
语句块N
esac
注意:
shell脚本中:
-a 代表与
-o 代表或
! 代表非
注意:如何让代码自动对齐:
—》先从插入模式转命令行模式—》直接按下ESC
—》在命令行模式下:gg=G
练习:从键盘获得一个字符串:判断如果是目录,则显示目录信息,如果是文件,则打印文件内容
代码如下:
1 #! /bin/bash
2
3 read -p “请输入一个字符串:” String
4
5 if [ -d ${String} ]
6 then
7 ls -a ${String}
8 elif [ -f ${String} ]
9 then
10 cat -n ${String}
11 else
12 echo “输入有误!”
13 fi
14
循环控制语句:
(1)for循环
格式1:
for 变量名 in 单词表
do
命令表
done
注意:
for循环可有三种模式去书写:
补充:
seq :用于产生某个数到另一个数之间的所有整数
(1)seq 1 100
while 循环格式:
while 命令表达式
do
命令
done
总结:while循环的变量不会自加,需要编码者手动更新变量值
for循环可以自动更新变量的值(在参数列表范围之内)
注意:break和continue在shell脚本中的作用和在C语言中一样
案例:
#! /bin/bash
for i in 1 2 3 4 5 6 7 8
do
if [ $i -eq 5 ]
then
#break
continue
else
echo ${i}
fi
done
shell函数:
格式:
function_name()
{
command1
command2
…
commandn
}
注意:函数返回值的范围是0-255之间,如果越过255则会从0开始重新赋值
当函数被定义好之后如何去调用该函数?
-------》
方式一:
value_name=function_name argc1 argc2.....
方式二:
function_name argc1 argc2 …