lv3 嵌入式开发-5 linux shell脚本编程(概念、变量、语句)

这篇具有很好参考价值的文章主要介绍了lv3 嵌入式开发-5 linux shell脚本编程(概念、变量、语句)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 Shell脚本概述

1.1Shell脚本概述

 Shell脚本是利用 shell 的功能所写的一个程序。这个程序是使用纯文本文件,将一些 shell 的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能

lv3 嵌入式开发-5 linux shell脚本编程(概念、变量、语句),嵌入式开发,linux

1.2Shell脚本编写流程

lv3 嵌入式开发-5 linux shell脚本编程(概念、变量、语句),嵌入式开发,linux

 第一个Shell脚本文件

#!/bin/bash

echo "hello world"
执行方式
        bash test.sh
        source  test.sh
        ./test.sh

2 Shell脚本变量

2.1变量介绍

变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。  

变量可以通过变量名访问。在指令式语言中,变量通常是可变的

2.2变量的作用

用来存放系统和用户需要使用的特定参数(值)  

变量名:使用固定的名称,由系统预设或用户定义  

变量值:能够根据用户设置、系统环境的变化而变化

2.3变量的命名要求

lv3 嵌入式开发-5 linux shell脚本编程(概念、变量、语句),嵌入式开发,linux

2.4变量的分类

lv3 嵌入式开发-5 linux shell脚本编程(概念、变量、语句),嵌入式开发,linux

2.4.1 用户自定义变量

变量可以再终端中使用,也可以代码中使用

在shell编程中通常使用全大写变量,方便识别
$ COUNT=1
变量的调用:在变量前加$ 
$ echo $COUNT



Linux Shell/bash从右向左赋值
$Y=y
$ X=$Y
$ echo $X 
y 


使用unset命令删除变量的赋值 
$ Z=hello 
$ echo $Z 
hello 
$ unset Z 
$ echo $Z 

取值 

双引号: 允许通过$符号引用其他变量值(不加引号也一样echo $COUNT echo "$COUNT")

        弱引用,其中的变量引用会被替换为变量值

单引号: 禁止引用其他变量值,$视为普通字符

        强引用,其中的变量引用不会被替换为变量值,而保持源字符串

反撇号: 命令替换,提取命令执行后的输出结果,``和$(…)作用相同

lv3 嵌入式开发-5 linux shell脚本编程(概念、变量、语句),嵌入式开发,linux

数组

#array数组
a=(1 2 3 4 5)
echo $a:默认显示数组a的第一个元素
echo ${a[0]} :显示数组中第一个元素,以此类推
echo ${a[-1]}: 显示数组中最后一个元素
echo ${a[*]} 和echo ${a[@]} :显示数组中所有元素
echo ${#a[@]} :显示数组中元素的个数
echo ${a[@]:起始元素id:元素个数]} :显示数组中以起始元素为首的指定个数的元素(注意:这里起始元素id不能为负值
unset a[n] 删除数组中的第n个元素
unset a 删除a这个数组

2.4.2 只读变量

变量值不允许修改(重新赋值)的情况

无法使用 unset删除

最快方法重启

readonly

readonly COUNT=3

2.4.3 位置变量和预定义变量


$0    与键入的命令行一样,包含脚本文件名
$1,$2,……$9 ${10} 分别包含第一个到第十个命令行参数
$#     包含命令行参数的个数
$@     包含所有命令行参数:“$1,$2,……$9”
$*     包含所有命令行参数,是一个整体:“$1,$2,……$9”
$?     包含前一个命令的退出状态
$$     包含正在执行进程的ID号

 示例:

#!/bin/bash
echo $0
echo $1
echo $2
echo $3
echo $#
执行
./test.sh 1 2 3 4 5
输出
./test.sh
1
2
3
5   //一共传入了5个

 lv3 嵌入式开发-5 linux shell脚本编程(概念、变量、语句),嵌入式开发,linux

lv3 嵌入式开发-5 linux shell脚本编程(概念、变量、语句),嵌入式开发,linux

2.4.4 环境变量

$USER 表示用户名称
$HOME 表示用户的宿主目录
$LANG 表示语言和字符集
$PWD 表示当前所在工作目录
$PATH 表示可执行用户程序的默认路径
export可以将变量指定为全局变量

示例

lv3 嵌入式开发-5 linux shell脚本编程(概念、变量、语句),嵌入式开发,linux

3 Shell语句

3.1 Shell程序

Shell 程序由零或多条shell语句构成。 shell语句包括三类:

说明性语句  功能性语句  结构性语句。

3.2 说明性语句

说明性语句(注释行)

以#号开始到该行结束,不被解释执行 注释行可以出现在程序中的任何位置,既可以单独占用一行, 也可以接在执行语句的后面. 以#号开始到所在行的行尾部分,都不被解释执行. 例如:

#! /bin/sh 
# 
# 本程序说明
#
command_1 
command_2                  # command_2的语句说明
……
# 下面程序段的说明
command_m
……
command_n                  # command_n语句的说明
……

3.3 功能性语句

read从标准输入读入一行, 并赋值给后面的变量,其语法为:

read  var  //  把读入的数据全部赋给var

示例: 

lv3 嵌入式开发-5 linux shell脚本编程(概念、变量、语句),嵌入式开发,linux

把读入行中的第一个单词(word)赋给var1, 第二个单词赋给var2, ……把其余所有的词赋给最后一个变量. 如果执行read语句时标准输入无数据, 则程序在此停留等侯, 直到数据的到来或被终止运行。  -t 跟随等待事件 -p 跟随终端的提示信息 -s输入不回显

示例:

lv3 嵌入式开发-5 linux shell脚本编程(概念、变量、语句),嵌入式开发,linux

lv3 嵌入式开发-5 linux shell脚本编程(概念、变量、语句),嵌入式开发,linux

lv3 嵌入式开发-5 linux shell脚本编程(概念、变量、语句),嵌入式开发,linux

算术运算命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘(\*)、整除(/)和求模(%)等操作。例如:
  $ expr  12  +  5  \*  3
  27
  $ expr  3  -  8  /  2
  -1
  $ num=9
  $ sum=`expr  $num  \*  6 `
  $ echo  $sum
  54

示例

 这里+前后需要空格lv3 嵌入式开发-5 linux shell脚本编程(概念、变量、语句),嵌入式开发,linux

test语句可测试三种对象:           字符串     整数     文件属性

条件成立输出0  条件不成立输出1

每种测试对象都有若干测试操作符 

字符串测试
s1 = s2   	测试两个字符串的内容是否完全一样
s1 != s2	测试两个字符串的内容是否有差异
-z s1 	             测试s1 字符串的长度是否为0
-n s1 	             测试s1 字符串的长度是否不为0

示例:

lv3 嵌入式开发-5 linux shell脚本编程(概念、变量、语句),嵌入式开发,linux

lv3 嵌入式开发-5 linux shell脚本编程(概念、变量、语句),嵌入式开发,linux 注意 加上双引号减少错误,否则会显示0

lv3 嵌入式开发-5 linux shell脚本编程(概念、变量、语句),嵌入式开发,linux

整数测试 
a -eq b 	    测试a 与b 是否相等
a -ne b		    测试a 与b 是否不相等
a -gt b 		测试a 是否大于b
a -ge b 		测试a 是否大于等于b
a -lt b 		测试a 是否小于b
a -le b 		测试a 是否小于等于b

示例:

lv3 嵌入式开发-5 linux shell脚本编程(概念、变量、语句),嵌入式开发,linux

文件测试
-e name    测试一个文件是否存在
-d name    测试name 是否为一个目录
-f name     测试name 是否为普通文件
-L name    测试name 是否为符号链接
-r name     测试name 文件是否存在且为可读
-w name   测试name 文件是否存在且为可写
-x name    测试name 文件是否存在且为可执行
-s name    测试name 文件是否存在且其长度不为0
f1 -nt f2    测试文件f1 是否比文件f2 更新
f1 -ot f2    测试文件f1 是否比文件f2 更旧

示例:

lv3 嵌入式开发-5 linux shell脚本编程(概念、变量、语句),嵌入式开发,linux

3.4 结构性语句

结构性语句主要根据程序的运行状态、输入数据、变量的取值、控制信号以及运行时间等因素来控制程序的运行流程。 主要包括:

条件测试语句(两路分支)

多路分支语句

循环语句

循环控制语句等文章来源地址https://www.toymoban.com/news/detail-693682.html

到了这里,关于lv3 嵌入式开发-5 linux shell脚本编程(概念、变量、语句)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • lv7 嵌入式开发-网络编程开发 13 UNIX域套接字

    目录 1 UNIX 域流式套接字 2 UNIX 域数据报套接字 UNIX 域流式套接字(UNIX domain stream socket)是一种在同一台主机上的进程之间进行通信的机制。它不依赖于网络协议栈,而是使用文件系统作为通信的基础。 UNIX 域流式套接字提供可靠的、双向的、面向连接的通信方式。与传统的

    2024年02月07日
    浏览(31)
  • lv6 嵌入式开发-Flappy bird项目(信号机制、定时器功能实现)

    目录 1 信号(signal) 2 设置信号响应方式 – signal 3 设置定时器 4 示例 问题: getch()阻塞获取键盘按键输入, 怎么操作才能不影响小鸟下落和管道移动? getch如果阻塞,下面的程序都是无法执行。通过信号机制方式实现。 在Linux中,软中断信号(signal,简称为信号)是在软件层

    2024年02月07日
    浏览(64)
  • lv7 嵌入式开发-网络编程开发 03 TCP/IP与五层体系结构

    目录 1 TCP/IP协议族体系结构 1.1 OSI与TCP/IP 1.2 TCP/IP 的体系结构  1.3 TCP/IP 体系结构的另一种表示方法 1.4 沙漏计时器形状的 TCP/IP 协议族 2 五层协议的体系结构 2.1 各层的主要功能  2.2 互联网中客户-服务器工作方式 2.3 同时为多个客户进程提供服务  3 练习 是事实上的国际标

    2024年02月07日
    浏览(32)
  • 嵌入式Linux:如何进行嵌入式Linux开发?

    目录 1、裸机开发 2、SDK开发 3、驱动开发 3.1、字符设备驱动 3.2、块设备驱动 3.3、网络设备驱动 4、应用开发 嵌入式Linux开发主要有四种方式:裸机开发、SDK开发、驱动开发和应用开发。 裸机开发通常指在没有操作系统支持的环境中直接在硬件上运行程序的开发。这种开发方

    2024年01月25日
    浏览(59)
  • 关于嵌入式开发的一些信息汇总:嵌入式C开发人员、嵌入式系统Linux

    这篇文章是关于嵌入式开发的一些基本信息,供想入行的人参考。有一些作者本人的想法,以及来自外网的大拿的文章翻译而来,原文链接在此Learning Linux for embedded systems,再次感谢,支持原创。 普通C开发人员和嵌入式C开发人员之间的 基本区别在于 ,因为嵌入式C程序被设

    2024年02月03日
    浏览(42)
  • 嵌入式开发:单片机嵌入式Linux学习路径

    SOC(System on a Chip)的本质区别在于架构和功能。低端SOC如基于Cortex-M架构的芯片,如STM32和NXP LPC1xxx系列,不具备MMU(Memory Management Unit),适用于轻量级实时操作系统如uCOS和FreeRTOS。高端SOC如基于Cortex-A架构的芯片,如三星、高通、飞卡、全志和瑞芯微等,具备MMU,支持虚拟内

    2024年02月15日
    浏览(36)
  • 嵌入式Linux开发教程汇总

    野火:https://doc.embedfire.com/products/link/zh/latest/linux/index.html 正点原子:http://47.111.11.73/docs/boards/arm-linux/index.html 百问网:http://download.100ask.net/books/Linux/ELADCM1/index.html 百问网:https://space.bilibili.com/275908810/channel/seriesdetail?sid=1714177 野火:https://space.bilibili.com/356820657/channel/seriesdeta

    2024年02月10日
    浏览(39)
  • 嵌入式Linux驱动开发之点灯

      使用驱动开发的方式点亮一个LED灯。看看两者有啥区别不? 首先查看原理图,看看我们的板子上的LED等接在哪一个IO口上面。 好了,看原理图我们知道LED灯接在芯片的GPIO1的第三个引脚上面,也就是GPIO1_IO03。 先掌握三个名词 CCM: Clock Controller Module (时钟控制模块) IOMUXC : I

    2024年02月01日
    浏览(82)
  • 嵌入式Linux开发-USB驱动

    哥们马上就要被裁了,总得整理一下技术方面的积累,准备开始下一轮的面试和找工作之旅了。。。。 通用串行总线(USB)是主机和外围设备之间的一种连接。 从拓扑上来看,是一颗由几个点对点的连接构建而成的树。这些连接是连接设备和集线器(hub)的四线电缆(底线、电源线

    2024年02月20日
    浏览(52)
  • 嵌入式开发之linux内核移植

    目录  前言 一、下载内核源码 1.1 下载linux-3.0.1 1.2 解压源码文件 二、 内核添加yaffs2文件系统支持 2.1 下载yaffs2 2.2 内核添加yaffs2文件补丁 三、配置开发板 3.1 修改机器ID 3.2 添加开发板初始化文件 3.3 配置NandFalsh 3.3.1 添加NandFlash设备 3.3.2 添加NandFlash驱动 3.3 修改Kconfig(支持

    2024年02月07日
    浏览(76)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包