Linux操作系统实验五 shell编程基础(一)

简介: Linux操作系统实验五 shell编程基础

1.实验目的与要求

  1. Shell特殊字符的使用
  2. Shell变量和运算符
  3. Shell输入输出语句
  4. Shell函数定义和调用

2.实验平台

实验室安装的实验环境(Linux操作系统)和头歌(www.educoder.net)实验平台(课程实验)

3.实验内容

  1. 练习Shell特殊字符的使用
  2. 练习Shell变量和字符串
  3. 练习Shell函数的使用

4.实验详细内容、步骤

任务描述

本关任务:欢迎来到shell 脚本世界,为了见证shell脚本的神奇,本小节带领大家写第一个shell脚本,希望脚本能够在右侧的命令行窗口中输出hello EduCoder

接下来让我们一起去开启shell脚本的快乐之旅吧!

相关知识

Shell是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。为了更好地学习shell编程,您需要对linux 系统命令有一定的了解,熟悉常用的命令,如:vim、echo、chmod等。

shell 语言编写的程序通常都非常轻巧,比如我想编写一个在屏幕上显示Hello World !程序:

  1. #!/bin/bash
  2. echo "Hello World !"

说明:#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 shellecho 命令用于向窗口输出文本内容。

Shell 脚本的运行通常有两种方法: 1、作为可执行程序运行

  1. chmod +x ./test.sh  #使脚本具有执行权限
  2. ./test.sh  #执行脚本

注意:一定要写成 ./test.sh,而不是 test.sh./的作用其实就是告诉系统就在当前目录查找,否则系统会去PATH路径中查找有没有test.sh的文件,而系统默认情况下只有 /bin, /sbin, /usr/bin/usr/sbin 等在 PATH 中,很难找到。

2、作为解释器参数运行,这种运行方式是直接运行解释器,其参数就是 shell 脚本的文件名,如:

  1. /bin/sh test.sh

这种方式运行的脚本,不需要在第一行指定解释器信息。

编程要求

请按照要求,完成以下实践内容。 1、在/opt/目录下创建第一个shell脚本 文件命名为 test.sh; 2、编写test.sh脚本,让其输出Hello EduCoder(通过 vim 编辑器编辑); 3、给/opt/test.sh赋予执行权限; 4、运行test.sh文件。

任务描述

本关带领大家熟悉 shell 的变量并掌握其使用。

变量概念

    从字面上来看就是可以变的量,举个例子,我们小时候都做过数学的应用题,经常定义 y 的值是某个数,如果换了一道题,还是定义 y 的值,但是 y 的值就不和第一道题相同了,这个 y 就是变量。

    变量是计算机内存的单元,在shell中变量其中存放的值可以改变。当 Shell 脚本需要保存一些信息时,如一段字符串或者一段数据,我们可以通过变量赋值的方式把他保存在变量中。

    每个变量都有一个名字,所以命令变量,尽量做到,见名知义。     那么,在 shell 中应该如何设置变量呢?其实 so easy,命令如下:

  1. [root@localhost ~]# name=jerry
  2. #定义变量name的值
  3. [root@localhost ~]# echo $name
  4. jerry
  5. #查询变量的值
变量类型

    运行 shell 时,会同时存在三种变量:

  1. 局部变量: 局部变量在脚本或命令中定义,仅在当前 shell 实例中有效,其他 shell 启动的程序不能访问局部变量,通常用于函数本地。
  • i.  #local 关键字
  • ii.  local VAR_NAME=VALUE
  1. 环境变量: 所有的程序,包括 shell 启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候 shell 脚本也可以定义环境变量 。
  • i. ##对当前shell进程及其子shell有效,对其它的shell进程无效  
  • ii. 定义:export VAR_NAME=VALUE
  • iii. 导出:export VAR_NAME
  • iv. 撤消变量:unset VAR_NAME
  • v. 只读变量:readonly VAR_NAME
  1. shell变量: shell变量是由 shell 程序设置的特殊变量。shell 变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了 shell 的正常运行      位置变量:用来接受变量指定位置的参数
  • i.   $1,$2...,${10}
  • ii.   ## 如下执行脚本a.sh
  • iii.   bash a.sh 1 2 3
  • iv.   ## $1即为第一个参数1  $2及为第二个参数 2

     特殊变量:shell 对一些参数做特殊处理,这些参数只能被引用而不能被赋值。

  • v. $#  传递到脚本的参数个数
  • vi. $*  显示所有向脚本传递的参数                  #与位置变量不同,此选项参数可超过9个
  • vii. $$  获取当前shell的进程号
  • viii. $!  执行上一个指令的进程号
  • ix. $?  获取执行的上一个指令的返回值              #0为执行成功,非零为执行失败
  • x. $-  显示shell使用的当前选项,与set命令功能相同
  • xi. $@  与$*相同,但是使用时加引号,并在引号中返回每个参数
变量定义规范

     1)在定义变量时,有一些规则需要遵守。

变量名可以由字母、数字和下画线组成,但是不能以数字开头,不能使用程序中的关键字(保留字),要见名知义。如果变量名是"20name或者if",则是错误的。

     2)在 Bash 中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型。比如:

  1. [root@localhost ~]# aa=1+2
  2. [root@localhost ~]# echo $aa
  3. 1+2

     看到了吧,变量 aa 的值不是"3",而是"1+2"。在 Bash 中,变量类型是字符串型,所以认为"1+2"只是一个字符串,而不会进行数值运算(数值运算方法会在后续章节中介绍)。

     3) 变量用等号"="连接值,"="左右两侧不能有空格。这是 Shell 语言特有的格式要求。在绝大多数的其他语言中,"="左右两侧是可以加入空格的。但是在 Shell 中命令的执行格式是"命令 [选项] [参数]",如果在"="左右两侧加入空格,那么 Linux 会误以为这是系统命令,是会报错的。

     4) 变量值中如果有空格,则需要使用单引号或双引号包含,如 test="hello world!"。双引号括起来的内容"$"和反引号者都拥有特殊含义,而单引号括起来的内容都是普通字符。

     5) 在变量值中,可以使用转义符"\"

     6) 如果需要増加变量值,那么可以进行变量叠加。 例如:

  1. [root@localhost ~]#test=123
  2. #叠加变量test,变量值变成了123456
  3. [root@localhost ~]#test=${test}456
  4. [root@localhost ~]# echo $test
  5. 123456

     7) 如果要把命令的执行结果作为变量值赋予变量,则需要使用反引号或 $() 包含命令。例如:

  1. ##$()引用执行结果
  2. [root@localhost ~]# test=$(date)
  3. [root@localhost ~]# echo $test
  4. Tue Feb 4 14:50:45 CST 2020

  5. ##反引号 引用执行结果
  6. root@Test-old-web01:~# test=`date`
  7. root@Test-old-web01:~# echo $test
  8. Tue Feb 4 14:51:19 CST 2020

     8) 环境变量名建议大写,便于区分。

删除变量

    使用 unset 命令可以删除变量。语法:

  1. unset variable_name

    变量被删除后不能再次使用。unset 命令不能删除只读变量(readonly myUrl 关键字 readonly 定义的变量叫做只读变量),如下:

  1. #!/bin/sh
  2. myUrl="http://www.educoder.net"
  3. unset myUrl
  4. echo $myUrl
  5. ##输出为空,是因为myurl已经被删除了

实践要求

  1. 创建一个脚本 /opt/test2.sh , 已知向 /opt/test.sh 传递参数 "www" "educoder" "net" 三个字符串。
  2. /opt/test.sh 需要实现如下功能:输出传递的参数的个数,并且输出第一个参数。

比如: 向 /opt/test2.sh传递 是"a" "b" "c" "d",则执行 bash /opt/test.sh a b c d 输出的结果应该是 4 a

任务描述

本关带领大家熟悉 shell 的变量并掌握其使用。

相关知识

字符串概念

     字符串是 shell 编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。

单引号 双引号 反引号的区别

     双引号 中可以有变量; 双引号里可以先转义字符;双引号中的单引号输出时维持单引号不变。请下面的案例: 例 1:

  1. #! /bin/bash
  2. var="aaa

  3. bbb
  4. ccc"
  5. echo ${var}

  6. ##输出结果为
  7. aaa bbb ccc

例 2:

  1. #! /bin/bash
  2. var="aaa

  3. bbb
  4. ccc"
  5. echo "${var}"
  6. ##输出结果为
  7. aaa

  8. bbb
  9. ccc

     单引号: 会忽略所有的特殊字符,即任何字符都会原样输出,包括定义的变量; 单引号字串中不能出现单引号。

  1. #! /bin/bash
  2. var="aaa

  3. bbb
  4. ccc"
  5. echo '${var}'
  6. ##输出结果为
  7. ${var}

  8. ###单引号无法解析变量,只会原样输出

    反引号 :  有命令替换的作用见例 3;反引号可以嵌套使用,但内层的单引号必须加上\ 进行转义见例 4。 例 3:

  1. $ echo the date is `date`
  2. the date is Tue Feb 4 18:08:12 CST 2020

  3. #这里的反引号 `date` 及为命令"date" 的结果,因此像引用一个命令返回的结果作为变量用 反引号 替换,也可以使用 $(date)的方式来替换使用命令结果

例 4:

  1. $ abc=`echo The number of users is \`who| wc -l\``
  2. $ echo $abc
  3. The number of users is 4

  4. ## 这里 `who|wc -l` 是指 返回的正在登录系统的用户的个数的结果 为4
  5. ## 因为反引号嵌套了反引号,所以在需要加上\转义
字符串常见操作表达式

示例:

获取字符串长度

  1. string="abcdefg"
  2. echo ${#string}

字符串截取

  1. ${string:position}    //在$string中, 从位置$position开始提取子串
  2. ${string:position:length}    //在$string中, 从位置$position开始提取长度为$length的子串

  3. 测试例子
  4. string="abc12342341"
  5. echo ${string:4}      //2342341  从第4位开始截取后面所有字符串  
  6. echo ${string:3:3}    //123      从第3位开始截取后面3位  
  7. echo ${string:3:6}    //123423   从第3位开始截取后面6位  
  8. echo ${string: -4}    //2341  :右边有空格   截取后4位  
  9. echo ${string:(-4)}   //2341  同上
  10. echo ${str:(-6):5}    //34234 从倒数第6个位置向左提取5个字符字符串,

字符串匹配删除

  1. ${string#substring}     //从变量$string的开头, 删除最短匹配$substring的子串
  2. ${string##substring}    //从变量$string的开头, 删除最长匹配$substring的子串
  3. ${string%substring}     //从变量$string的结尾, 删除最短匹配$substring的子串
  4. ${string%%substring}    //从变量$string的结尾, 删除最长匹配$substring的子串

  5. 测试例子
  6.    test='c:/windows/boot.ini'
  7.    $ echo ${test#/} (从头匹配斜杠/,删除匹配到最短的斜杠,没有匹配到,所以没有删除)
  8.    c:/windows/boot.ini
  9.    $ echo ${test#*/}  (删除 从头匹配删除匹配到最短以/结尾的字符串,*是匹配0个或者多个)
  10.    windows/boot.ini
  11.    $ echo ${test##*/} (删除 从头匹配匹配到最长的以/结尾的字符串,通常可以用来获取到文件名)
  12.    boot.ini

  13.    $ echo ${test%/*} (删除 从尾部匹配以/开始最短的字符串,通常可以获取到文件路径前缀)
  14.    c:/windows
  15.    $ echo ${test%%/*} (删除 从尾部匹配以/开始最长的字符串)
  16.    c:

字符串替换

  1. 表达式规则
  2. ${string/substring/replacement}         使用$replacement, 来代替第一个匹配的$substring
  3. ${string//substring/replacement}    使用$replacement, 代替所有匹配的$substring
  4. ${string/#substring/replacement}    如果$string的前缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
  5. ${string/%substring/replacement}    如果$string的后缀匹配$substring, 那么就用$replacement来代替匹配到的$substring

  6. 测试列子:
  7. str="apple, tree, apple tree"
  8. echo ${str/apple/APPLE}   # 替换第一次出现的apple
  9. APPLE, tree, apple tree
  10. echo ${str//apple/APPLE}  # 替换所有apple
  11. APPLE, tree, APPLE tree
  12. echo ${str/#apple/APPLE}  # 如果字符串str以apple开头,则用APPLE替换它
  13. APPLE, tree, apple tree
  14. echo ${str/%apple/APPLE}  # 如果字符串str以apple结尾,则用APPLE替换它(str是以tree结尾的)
  15. apple, tree, apple tree

  16. 测试列子2:
  17. $ test='c:/windows/boot.ini'
  18. $ echo ${test/\//\\}  (匹配的为\/,匹配的子串/需要转义,所以添加\,同理替换的字符串\转义为\\)
  19. c:\windows/boot.ini
  20. $ echo ${test//\//\\}
  21. c:\windows\boot.ini
  22. #${变量/查找/替换值} 一个“/”表示替换第一个,”//”表示替换所有,当查找中出现了:”/”请加转义符”\/”表示。
相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
目录
相关文章
|
6天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
34 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
24天前
|
存储 Shell Linux
Linux 如何更改默认 Shell
Linux 如何更改默认 Shell
30 0
Linux 如何更改默认 Shell
|
2月前
|
Web App开发 网络协议 Linux
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
这篇文章是关于Linux命令的总结,涵盖了从基础操作到网络配置等多个方面的命令及其使用方法。
78 1
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
|
1月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
2月前
|
Shell
Shell编程(下)
Shell编程(下)
110 1
|
2月前
|
Shell Linux Windows
Shell编程(上)
Shell编程(上)
47 1
|
2月前
|
Shell Linux 开发工具
|
2月前
|
IDE 开发工具 Android开发
探索移动应用开发之旅:理解移动操作系统与编程实践
【9月更文挑战第36天】在数字化时代的浪潮中,移动应用成为连接用户与数字世界的桥梁。本文将深入探讨移动应用开发的精髓,从移动操作系统的工作原理到实际编程实践,旨在为读者提供一条清晰的道路,以理解和掌握移动应用的开发过程。我们将通过具体示例,揭示如何在不断变化的技术环境中保持应用的性能、安全性和用户体验。无论你是初学者还是有经验的开发者,本文都将为你打开一扇窗,让你一窥移动应用开发的精彩世界。
|
2月前
|
安全 测试技术 数据库
Python编程--sys模块及OS模块简单用例
Python编程--sys模块及OS模块简单用例
37 1
|
2月前
|
算法 调度 UED
探索操作系统中的多线程编程
【8月更文挑战第78天】在数字世界的复杂迷宫中,操作系统扮演着至关重要的角色。本文旨在揭开操作系统中多线程编程的神秘面纱,引导读者理解其概念、实现及应用。通过深入浅出的方式,我们将探讨如何在程序设计中运用多线程,以及这一技术如何优化软件性能和提升用户体验。文章将结合具体代码示例,展示多线程在实际应用中的魔力。无论你是编程新手还是资深开发者,这篇文章都将为你提供新的视角和思考路径。