嵌入式学习DAY13 --- shell脚本的用法和编写讲解

嵌入式入门学习笔记,遇到的问题以及心得体会!
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=当前该文件的绝对路径: PATH2vim /.bashrcexportPATH=: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 …

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值