制作一个OpenHarmony视频播放器

简介

媒体子系统是 OpenHarmony 中重要的子系统,可以提供音视频播放能力。媒体子系统为开发者提供一套简单且易于理解的接口,使得开发者能够方便接入系统并使用系统的媒体资源。媒体子系统提供以下常用功能:

  • 音视频播放(AVPlayer9+),AudioPlayer6+ 和 VideoPlayer8+ 整合,升级了状态机和错误码,推荐使用
  • 音视频录制(AVRecorder9+),AudioRecorder6+ 和 VideoRecorder9+ 整合,推荐使用
  • 音频播放(AudioPlayer6+),AVPlayer9+ 发布后停止维护,请使用 AVPlayer9+
  • 视频播放(VideoPlayer8+),AVPlayer9+ 发布后停止维护,请使用 AVPlayer9+
  • 音频录制(AudioRecorder6+),AVRecorder9+ 发布后停止维护,请使用 AVRecorder9+
  • 视频录制(VideoRecorder9+),AVRecorder9+ 发布后停止维护,请使用 AVRecorder9+

从 3.2 开始 OpenHarmony 推出了 AVPlayer 和 AVRecorder 接口,之前的 VideoPlayer、AudioPlayer 这些接口会停止维护,所以我们今天学习下怎么使用 AVPlayer 接口


导入模块

import media from '@ohos.multimedia.media';` ​
  • 创建 avplayer
this.avPlayer = await media.createAVPlayer()` ​

如上,我们使用的是 promise 接口,对应的接口定义为:

/*** Creates an AVPlayer instance.* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @param callback Callback used to return AVPlayer instance if the operation is successful; returns null otherwise.* @throws { BusinessError } 5400101 - No memory. Return by callback.*/function createAVPlayer(callback: AsyncCallback<AVPlayer>): void;/*** Creates an AVPlayer instance.* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @returns A Promise instance used to return AVPlayer instance if the operation is successful; returns null otherwise.* @throws { BusinessError } 5400101 - No memory. Return by promise.*/function createAVPlayer() : Promise<AVPlayer>;` ​*   注册 avplayer 回调`//注册状态变化回调,不同状态时做不同动作avPlayer.on('stateChange', async (state, reason) => {……})//注册时间变化回调,方便更新进度条时间avPlayer.on('timeUpdate', (time:number) => {……})
  • avplayer 播放流程

//视频播放伪代码
async avPlayerDemo() {this.avPlayer.on('stateChange', async (state, reason) => {switch (state) {case 'idle': // 成功调用reset接口后触发该状态机上报console.info(TAG + 'state idle called')this.avPlayer.release() // 释放avplayer对象break;case 'initialized': // avplayer 设置播放源后触发该状态上报console.info(TAG + 'state initialized called ')this.avPlayer.surfaceId = this.surfaceID // 设置显示画面,当播放的资源为纯音频时无需设置this.avPlayer.prepare().then(() => {console.info(TAG+ 'prepare success');}, (err) => {console.error(TAG + 'prepare filed,error message is :' + err.message)})break;case 'prepared': // prepare调用成功后上报该状态机console.info(TAG + 'state prepared called')this.avPlayer.play() // 调用播放接口开始播放break;case 'playing': // play成功调用后触发该状态机上报console.info(TAG + 'state playing called')if (this.count == 0) {this.avPlayer.pause() // 调用暂停播放接口} else {this.avPlayer.seek(10000, media.SeekMode.SEEK_PREV_SYNC) // 前向seek置10秒处,触发seekDone回调函数}break;case 'paused': // pause成功调用后触发该状态机上报console.info(TAG + 'state paused called')if (this.count == 0) {this.count++this.avPlayer.play() // 继续调用播放接口开始播放}break;case 'completed': // 播放结束后触发该状态机上报console.info(TAG + 'state completed called')this.avPlayer.stop() //调用播放结束接口break;case 'stopped': // stop接口成功调用后触发该状态机上报console.info(TAG + 'state stopped called')this.avPlayer.reset() // 调用reset接口初始化avplayer状态break;case 'released':console.info(TAG + 'state released called')break;case 'error':console.info(TAG + 'state error called')break;default:console.info(TAG + 'unkown state :' + state)break;}})// 创建avPlayer实例对象this.avPlayer = await media.createAVPlayer()let fdPath = 'fd://'let pathDir = "/data/storage/el2/base/haps/entry/files" // pathDir在FA模型和Stage模型的获取方式不同,请参考开发步骤首行的说明,根据实际情况自行获取。// path路径的码流可通过"hdc file send D:\xxx\H264_AAC.mp4 /data/app/el2/100/base/ohos.acts.multimedia.media.avplayer/haps/entry/files" 命令,将其推送到设备上let path = pathDir  + '/H264_AAC.mp4'let file = await fs.open(path)fdPath = fdPath + '' + file.fd//赋值url后就会进入stateChange callbackthis.avPlayer.url = fdPath
}
  • 其他播放控制接口
          /*** Prepare audio/video playback, it will request resource for playing.* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @param callback A callback instance used to return when prepare completed.* @throws { BusinessError } 5400102 - Operation not allowed. Return by callback.* @throws { BusinessError } 5400106 - Unsupport format. Return by callback.*/prepare(callback: AsyncCallback<void>): void;/*** Prepare audio/video playback, it will request resource for playing.* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @returns A Promise instance used to return when prepare completed.* @throws { BusinessError } 5400102 - Operation not allowed. Return by promise.* @throws { BusinessError } 5400106 - Unsupport format. Return by promise.*/prepare(): Promise<void>;/*** Play audio/video playback.* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @param callback A callback instance used to return when play completed.* @throws { BusinessError } 5400102 - Operation not allowed. Return by callback.*/play(callback: AsyncCallback<void>): void;/*** Play audio/video playback.* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @returns A Promise instance used to return when play completed.* @throws { BusinessError } 5400102 - Operation not allowed. Return by promise.*/play(): Promise<void>;/*** Pause audio/video playback.* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @param callback A callback instance used to return when pause completed.* @throws { BusinessError } 5400102 - Operation not allowed. Return by callback.*/pause(callback: AsyncCallback<void>): void;/*** Pause audio/video playback.* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @returns A Promise instance used to return when pause completed.* @throws { BusinessError } 5400102 - Operation not allowed. Return by promise.*/pause(): Promise<void>;/*** Stop audio/video playback.* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @param callback A callback instance used to return when stop completed.* @throws { BusinessError } 5400102 - Operation not allowed. Return by callback.*/stop(callback: AsyncCallback<void>): void;/*** Stop audio/video playback.* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @returns A Promise instance used to return when stop completed.* @throws { BusinessError } 5400102 - Operation not allowed. Return by promise.*/stop(): Promise<void>;/*** Reset AVPlayer, it will to idle state and can set src again.* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @param callback A callback instance used to return when reset completed.* @throws { BusinessError } 5400102 - Operation not allowed. Return by callback.*/reset(callback: AsyncCallback<void>): void;/*** Reset AVPlayer, it will to idle state and can set src again.* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @returns A Promise instance used to return when reset completed.* @throws { BusinessError } 5400102 - Operation not allowed. Return by promise.*/reset(): Promise<void>;/*** Releases resources used for AVPlayer.* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @param callback A callback instance used to return when release completed.* @throws { BusinessError } 5400102 - Operation not allowed. Return by callback.*/release(callback: AsyncCallback<void>): void;/*** Releases resources used for AVPlayer.* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @returns A Promise instance used to return when release completed.* @throws { BusinessError } 5400102 - Operation not allowed. Return by promise.*/release(): Promise<void>;/*** Jumps to the specified playback position.* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @param timeMs Playback position to jump, should be in [0, duration].* @param mode See @SeekMode .*/seek(timeMs: number, mode?:SeekMode): void;` ​
  • 其他回调接口
          /*** Register or unregister listens for media playback events.* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @param type Type of the playback event to listen for.* @param callback Callback used to listen for the playback stateChange event.*/on(type: 'stateChange', callback: (state: AVPlayerState, reason: StateChangeReason) => void): void;off(type: 'stateChange'): void;/*** Register or unregister listens for media playback events.* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @param type Type of the playback event to listen for.* @param callback Callback used to listen for the playback volume event.*/on(type: 'volumeChange', callback: Callback<number>): void;off(type: 'volumeChange'): void;/*** Register or unregister listens for media playback events.* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @param type Type of the playback event to listen for.* @param callback Callback used to listen for the playback end of stream*/on(type: 'endOfStream', callback: Callback<void>): void;off(type: 'endOfStream'): void;/*** Register or unregister listens for media playback events.* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @param type Type of the playback event to listen for.* @param callback Callback used to listen for the playback seekDone event.*/on(type: 'seekDone', callback: Callback<number>): void;off(type: 'seekDone'): void;/*** Register or unregister listens for media playback events.* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @param type Type of the playback event to listen for.* @param callback Callback used to listen for the playback speedDone event.*/on(type: 'speedDone', callback: Callback<number>): void;off(type: 'speedDone'): void;/*** Register or unregister listens for media playback events.* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @param type Type of the playback event to listen for.* @param callback Callback used to listen for the playback setBitrateDone event.*/on(type: 'bitrateDone', callback: Callback<number>): void;off(type: 'bitrateDone'): void;/*** LRegister or unregister listens for media playback events.* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @param type Type of the playback event to listen for.* @param callback Callback used to listen for the playback timeUpdate event.*/on(type: 'timeUpdate', callback: Callback<number>): void;off(type: 'timeUpdate'): void;/*** Register or unregister listens for media playback events.* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @param type Type of the playback event to listen for.* @param callback Callback used to listen for the playback durationUpdate event.*/on(type: 'durationUpdate', callback: Callback<number>): void;off(type: 'durationUpdate'): void;/*** Register or unregister listens for video playback buffering events.* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @param type Type of the playback buffering update event to listen for.* @param callback Callback used to listen for the buffering update event, return BufferingInfoType and the value.*/on(type: 'bufferingUpdate', callback: (infoType: BufferingInfoType, value: number) => void): void;off(type: 'bufferingUpdate'): void;/*** Register or unregister listens for start render video frame events.* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @param type Type of the playback event to listen for.* @param callback Callback used to listen for the playback event return .*/on(type: 'startRenderFrame', callback: Callback<void>): void;off(type: 'startRenderFrame'): void;/*** Register or unregister listens for video size change event.* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @param type Type of the playback event to listen for.* @param callback Callback used to listen for the playback event return video size.*/on(type: 'videoSizeChange', callback: (width: number, height: number) => void): void;off(type: 'videoSizeChange'): void;/*** Register or unregister listens for audio interrupt event, refer to {@link #audio.InterruptEvent}* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @param type Type of the playback event to listen for.* @param callback Callback used to listen for the playback event return audio interrupt info.*/on(type: 'audioInterrupt', callback: (info: audio.InterruptEvent) => void): void;off(type: 'audioInterrupt'): void;/*** Register or unregister listens for available bitrate list collect completed events for HLS protocol stream playback.* This event will be reported after the {@link #prepare} called.* @since 9* @syscap SystemCapability.Multimedia.Media.AVPlayer* @param type Type of the playback event to listen for.* @param callback Callback used to listen for the playback event return available bitrate list.*/on(type: 'availableBitrates', callback: (bitrates: Array<number>) => void): void;off(type: 'availableBitrates'): void;

简单样例

  • 界面
 build() {Stack({ alignContent: Alignment.Center }) {if (this.isShowMenu) {Column() {//视频名称PlayTitle({ title: this.displayName, handleBack: this.handleBack })Row() {//播放控件PreVideo({ handleClick: this.handlePrevClick })PlayButton({ isPlaying: $isPlaying })NextVideo({ handleClick: this.handleNextClick })}.margin({ top: '40%' })Blank()//时间刻度Row() {Text(getTimeString(this.currentTime)).fontSize(25).fontColor(Color.White)Blank()Text(this.fileAsset ? getTimeString(this.fileAsset.duration) : '00:00').fontSize(25).fontColor(Color.White)}.width('95%')//进度条Slider({ value: this.fileAsset ? this.currentTime / this.fileAsset.duration * 100 : 0 }).width('92%').selectedColor(Color.White).onChange((value: number) => {Logger.info(TAG, 'seek time change')this.currentTime = this.fileAsset.duration * value / 100this.videoPlayer.seek(this.currentTime)})}.height('100%').zIndex(2)}Row() {XComponent({id: 'componentId',type: 'surface',controller: this.mxcomponentController}).onLoad(() => {Logger.info(TAG, 'onLoad is called')this.playVideo()}).width('100%').aspectRatio(this.ratio)}.height('100%').width('100%').justifyContent(FlexAlign.Center)}.width('100%').height('100%').backgroundColor(Color.Black).onClick(() => {this.isShowMenu = !this.isShowMenu})}
  • 播放
      //根据视频文件获取视频源尺寸并生成surface//视频文件的路径在/storage/media/100/local/files/Videosasync prepareVideo() {this.ratio = this.fileAsset.width / this.fileAsset.heightthis.mxcomponentController.setXComponentsurfaceSize({surfaceWidth: this.fileAsset.width,surfaceHeight: this.fileAsset.height})this.surfaceId = this.mxcomponentController.getXComponentsurfaceId()this.fd = await this.fileAsset.open('Rw')Logger.info(TAG, `fd://' ${this.fd} `)return 'fd://' + this.fd}//初始化视频文件并初始化avplayerasync playVideo() {Logger.info(TAG, 'playVideo')try{await this.getMediaList()let fdPath = await this.prepareVideo()this.videoPlayer.on('timeUpdate', (time:number) => {console.info('timeUpdate success,and new time is :' + time)this.currentTime = time;})await this.videoPlayer.initVideoPlayer(fdPath, this.surfaceId)this.isPlaying = true}catch(error) {Logger.info(TAG, `playVideo error ${JSON.stringify(error)}`)}}

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/818454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

比特币减半:挑战与机遇

比特币减半是加密货币领域中一件备受关注的大事&#xff0c;它不仅影响着比特币本身的发展&#xff0c;也深刻影响着整个加密货币市场的走势。在这个历史性时刻&#xff0c;我们有必要深入分析比特币减半带来的挑战与机遇&#xff0c;以及未来的加密货币发展趋势。 挑战&#x…

【Entity Framework】聊一聊EF中继承关系

【Entity Framework】聊一聊EF中继承关系 文章目录 【Entity Framework】聊一聊EF中继承关系一、概述二、实体类型层次结构映射三、每个层次结构一张表和鉴别器配置四、共享列五、每个类型一张表配置六、每个具体类型一张表配置七、TPC数据库架构八、总结 一、概述 Entity Fra…

如何实现对空调状态监测的监控

随着科技的飞速发展和人们生活水平的持续提高&#xff0c;空调已经成为现代家庭和办公环境中不可或缺的一部分。然而&#xff0c;传统的空调使用方式往往存在能效低下、操作不便等问题。为了解决这些问题&#xff0c;智能空调控制器应运而生&#xff0c;它不仅能实现对空调状态…

盘点2024年最新可用免费云服务器

随着云计算技术的快速发展&#xff0c;越来越多的企业和个人开始使用云服务器来满足各种业务需求。云服务器作为云计算的核心服务之一&#xff0c;以其弹性扩展、按需付费等特点受到广泛关注。本文将为大家盘点2024年最新可用免费云服务器&#xff0c;助力大家轻松上云&#xf…

mysql的下载、安装

首先进入官网&#xff1a;MySQL 点击“downloads”进入下载界面 2.往下滑动滚轮&#xff0c;点击“mysql community...&#xff08;公开版&#xff09;” 3.往下滑&#xff0c;找到并单击“install for Windows” 4.选择版本&#xff1a;初学者可以使用较低版本&#xff0c;较…

软件架构静态演化

1.静态演化需求 软件架构静态演化的需求是广泛存在的&#xff0c;可以归结为两个方面。 &#xff08;1&#xff09;设计时演化需求。在架构开发和实现过程中对原有架构进行调整&#xff0c;保证软件实现与架构的一致性以及软件开发过程的顺利进行。 &#xff08;2&#xff09;运…

20240409在全志H3平台的Nano Pi NEO CORE开发板上运行Ubuntu Core16.04时跑通4G模块EC200A-CN【PPP模式】

20240409在全志H3平台的Nano Pi NEO CORE开发板上运行Ubuntu Core16.04时跑通4G模块EC200A-CN【PPP模式】 2024/4/9 14:25 【不建议使用ppp模式&#xff0c;功耗大&#xff0c;貌似更过分的&#xff01;网速还低&#xff01;】 【唯一的优点&#xff1a;ppp模式下是通过脚本配置…

什么是WAAP,对网络安全可以起到哪些帮助

自从只能在本地设备上安装并运行应用程序的时代以来&#xff0c;我们在技术方面取得了长足的进步。随着云计算的兴起、网络的普及和带宽的提高&#xff0c;现代Web应用程序的访问变得像在浏览器中输入网址一样简单。 这意味着企业可以更方便地部署用于为客户提供服务的应用程序…

Excel文件解析

在此模块的学习中&#xff0c;我们需要一个新的开源类库---Apahche POI开源类库。这个类库的用途是&#xff1a;解析并生成Excel文件(Word、ppt)。Apahche POI基于DOM方式进行解析&#xff0c;将文件直接加载到内存&#xff0c;所以速度比较快&#xff0c;适合Excel文件数据量不…

【Qt 学习笔记】Qt常用控件 | 按钮类控件Radio Button的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 按钮类控件Radio Button的使用及说明 文章编号&#xff…

每日一题---OJ题: 有效的括号

片头 嗨! 小伙伴们,大家好! 我们又见面啦! 今天我们来一起尝试一下这道题目---有效的括号,准备好了吗? 我们开始咯! 说实话,我刚开始做这道题的时候也是一脸懵,怎么进行括号匹配呢? 别慌,我们一起画个图,分析分析括号匹配的过程~ 如下图所示,上方表示一个字符串数组,存放不…

深入剖析Tomcat(二) 实现一个简单的Servlet容器

现在开始《深入剖析Tomcat》第二章的内容&#xff0c;第一章中&#xff0c;我们编码实现了一个能正常接收HTTP请求并返回静态资源的Web容器&#xff0c;这一章开始引入Servlet的概念&#xff0c;使我们的服务能根据请求动态返回内容。 Servlet是什么&#xff1f; 这是首先要弄…

腾讯EdgeOne产品测评体验——开启安全防护,保障数据无忧

当今时代数字化经济蓬勃发展人们的生活逐渐便利&#xff0c;类似线上购物、线上娱乐、线上会议等数字化的服务如雨后春笋般在全国遍地生长&#xff0c;在人们享受这些服务的同时也面临着各式各样的挑战&#xff0c;如网络数据会不稳定、个人隐私容易暴露、资产信息会被攻击等。…

单链表链表专题

1 链表的概念 概念&#xff1a;链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表的结构跟⽕⻋⻋厢相似&#xff0c;淡季时⻋次的⻋厢会相应减少&#xff0c;旺季时⻋次的⻋厢会额外增加⼏节。只 需要…

MySQL表结构的操作

文章目录 1. 创建表2. 查看表3. 修改表4. 删除表 1. 创建表 create table table_name (field1 datatype,field2 datatype,field3 datatype )character set 字符集 collate 校验集 engine 存储引擎;field&#xff1a;列名datatype&#xff1a;列的类型character set&#xff1a…

zookeeper分布式应用程序协调服务+消息中间件kafka分布式数据处理平台

一、zookeeper基本介绍 1.1 zookeeper的概念 Zookeeper是一个开源的分布式的&#xff0c;为分布式框架提供协调服务的Apache项目。 是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服务、…

滑动窗口题解2

目录 1 找到字符串中所有字母异位词 分析&#xff1a; 代码展示&#xff1a; 代码展示&#xff1a; 2 串联所有单词的子串 分析&#xff1a; 代码展示&#xff1a; 3 串联所有单词的子串 分析&#xff1a; 代码展示&#xff1a; 4 水果成篮 分析&#xff1a; 代码展…

障碍物识别技术赋能盲人独立出行:一场静默的科技革新

作为一名资深记者&#xff0c;我始终关注并报道那些科技如何助力特殊群体克服生活挑战的动人故事。近期&#xff0c;一款叫做蝙蝠避障的应用进入了我的视线&#xff0c;它搭载先进障碍物识别技术以其独特的优势&#xff0c;悄然为视障人士的独立出行带来了显著变革。 “障碍物识…

一.shell基本知识

目录 1.1为什么学习和使用Shell编程 1.2什么是Shell 1.2.1 shell的起源 1.2.2shell的功能 1.3shell的分类 1.4作为程序设计的语言一—shell 1.5如何学好shell 1.6shell脚本的基本元素 1.7 shell脚本编写规范 1.8 shell脚本的执行方式 1.9 执行脚本的方法 1.10 shel…