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

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

字符串比较     四种判断方式 == != < > (按 ascii 值比较大小), == 相等则为真,!= 不相等则为真。

  1. str="bacd"
  2. ##判断字符串是否相等 这里的== 也可以换做 =  但是一般情况下使用==
  3. if [ "$str"x == "abcdsd"x ]; then
  4.    echo "相等"
  5. fi

  6. ##不相等则为真
  7. if [ "$str"x != "abcdsd"x ]; then
  8.    echo "不相等"
  9. fi

  10. ##注意  比较字符串是否相等,可以字符串后面+上个别的字符,如果str为空的话,可以防止表达式报错:[: =: unary operator expected

实践要求

按照右侧“代码文件”中提示的要求补全代码,本关的目的,是希望通过学习,对于字符串的使用能有一个大致的了解,在实际工作中遇到需要对某一个字符串处理的时候,能够找到对应的方法。

任务描述

本关将带领大家熟悉 bash 的内置命令,并掌握一些常用的内置命令。     在开启此小节之前,相信你已经对 shell 编程的变量和字符串的使用有了一定的了解。需注意: 本课程没有描述 shell 数组的概念,因为在实际的操作中 shell 数组并不是很友好,一般在数据处理的模型都用 python 来代替 shell,如果大家对 shell 数组感兴趣,请同学们可以自行翻阅资料了解一下 shell 的数组概念。

相关知识

什么是内建命令

    所谓 Shell 内建命令,就是由 Bash 自身提供的命令,而不是文件系统中的某个可执行文件。     例如,用于进入或者切换目录的 cd 命令,虽然我们一直在使用它,但如果不加以注意,很难意识到它与普通命令的性质是不一样的:该命令并不是某个外部文件,只要在 Shell 中你就可以运行这个命令。     可以使用 type 来确定一个命令是否是内建命令:

  1. root@Test-old-web01:/opt/f89vxyw7/task1# type cd
  2. cd is a shell builtin
  3. root@Test-old-web01:/opt/f89vxyw7/task1# type ifconfig
  4. ifconfig is /sbin/ifconfig

    由此可见,cd 是一个 Shell 内建命令,而 ifconfig 是一个外部文件,它的位置是/sbin/ifconfig。     还记得系统变量 $PATH 吗?$PATH 变量包含的目录中几乎聚集了系统中绝大多数的可执行命令,它们都是外部命令。

    通常来说,内建命令会比外部命令执行得更快,执行外部命令时不但会触发磁盘 I/O,还需要 fork 出一个单独的进程来执行,执行完成后再退出。而执行内建命令相当于调用当前 Shell 进程的一个函数。

shell有哪些内建命令

    下表列出了 Bash Shell 中直接可用的内建命令。

    命令 说明

  1. :    扩展参数列表,执行重定向操作
  2. .    读取并执行指定文件中的命令(在当前 shell 环境中)
  3. alias    为指定命令定义一个别名
  4. bg    将作业以后台模式运行
  5. bind    将键盘序列绑定到一个 readline 函数或宏
  6. break    退出 for、while、select 或 until 循环
  7. builtin    执行指定的 shell 内建命令
  8. caller    返回活动子函数调用的上下文
  9. cd    将当前目录切换为指定的目录
  10. command    执行指定的命令,无需进行通常的 shell 查找
  11. compgen    为指定单词生成可能的补全匹配
  12. complete    显示指定的单词是如何补全的
  13. compopt    修改指定单词的补全选项
  14. continue    继续执行 for、while、select 或 until 循环的下一次迭代
  15. declare    声明一个变量或变量类型。
  16. dirs    显示当前存储目录的列表
  17. disown    从进程作业表中刪除指定的作业
  18. echo    将指定字符串输出到 STDOUT
  19. enable    启用或禁用指定的内建shell命令
  20. eval    将指定的参数拼接成一个命令,然后执行该命令
  21. exec    用指定命令替换 shell 进程
  22. exit    强制 shell 以指定的退出状态码退出
  23. export    设置子 shell 进程可用的变量
  24. fc    从历史记录中选择命令列表
  25. fg    将作业以前台模式运行
  26. getopts    分析指定的位置参数
  27. hash    查找并记住指定命令的全路径名
  28. help    显示帮助文件
  29. history    显示命令历史记录
  30. jobs    列出活动作业
  31. kill    向指定的进程 ID(PID) 发送一个系统信号
  32. let    计算一个数学表达式中的每个参数
  33. local    在函数中创建一个作用域受限的变量
  34. logout    退出登录 shell
  35. mapfile    从 STDIN 读取数据行,并将其加入索引数组
  36. popd    从目录栈中删除记录
  37. printf    使用格式化字符串显示文本
  38. pushd    向目录栈添加一个目录
  39. pwd    显示当前工作目录的路径名
  40. read    从 STDIN 读取一行数据并将其赋给一个变量
  41. readarray    从 STDIN 读取数据行并将其放入索引数组
  42. readonly    从 STDIN 读取一行数据并将其赋给一个不可修改的变量
  43. return    强制函数以某个值退出,这个值可以被调用脚本提取
  44. set    设置并显示环境变量的值和 shell 属性
  45. shift    将位置参数依次向下降一个位置
  46. shopt    打开/关闭控制 shell 可选行为的变量值
  47. source    读取并执行指定文件中的命令(在当前 shell 环境中)
  48. suspend    暂停 Shell 的执行,直到收到一个 SIGCONT 信号
  49. test    基于指定条件返回退出状态码 0 或 1
  50. times    显示累计的用户和系统时间
  51. trap    如果收到了指定的系统信号,执行指定的命令
  52. type    显示指定的单词如果作为命令将会如何被解释
  53. typeset    声明一个变量或变量类型。
  54. ulimit    为系统用户设置指定的资源的上限
  55. umask    为新建的文件和目录设置默认权限
  56. unalias    刪除指定的别名
  57. unset    刪除指定的环境变量或 shell 属性
  58. wait    等待指定的进程完成,并返回退出状态码
常用的内建命令

     一下子掌握所有的内建命令难度要求比较大,我们可以从常用内建命令入手,第一个内置命令: alias。 1、alias      alias 用来给命令创建一个别名。若直接输入该命令且不带任何参数,则列出当前 Shell 进程中使用了哪些别名,如下:

  1. root@Test-old-web01:/opt/f89vxyw7/task1# alias
  2. alias egrep='egrep --color=auto'
  3. alias fgrep='fgrep --color=auto'
  4. alias grep='grep --color=auto'
  5. alias l='ls -CF'
  6. alias la='ls -A'a
  7. alias ll='ls -alF'
  8. alias ls='ls --color=auto'

     现在你应该能理解类似ll这样的命令为什么与ls -l或者 ls -alF的效果是一样的吧,是因为ls -alF 被重新命名为ll 。因此,在命令行输入 ll ,即相当于输入了 ls -alF

    使用 alias 命令自定义别名的语法格式为(临时):

  1.    alias new_name='command'

    通过 date 命令可以获得当前的 UNIX 时间戳,具体写法为 date +%s,如果你嫌弃它太长或者不容易记住,那可以给它定义一个别名。

  1.    alias timestamp='date +%s'

    这样你在命令行输入 timestamp获得的效果及跟输入date +%s一样,如下:

  1. root@Test-old-web01:/opt/f89vxyw7/task1# date +%s
  2. 1580972143
  3. root@Test-old-web01:/opt/f89vxyw7/task1# alias timestamp='date +%s'
  4. root@Test-old-web01:/opt/f89vxyw7/task1# timestamp
  5. 1580972158

    注意:通过以上方式命令别名后,在退出当前窗口后,刚设定的 alias 命令别名也就消失了,如何才能永久使用了?请看下面的介绍:

    首先,如果想让别名能够在不同的 shell 会话中使用,就需要把它们添加到 shell 用来保存别名的文件中。大多数情况下,这个文件不是 .bashrc,就是 .bash_aliases,我们使用的系统 CentOS,是保存在.bashrc里。(或者可以在 root 家目录下输入:ls -a ~看到那个文件)

    如果要永久保存,就把alias new_name='command'给编辑到 /root/.bashrc下,然后:wq保存退出,但得重新加载别名文件,才能生效,可执行 source ~/.bashrc (这样更改后只有 root 用户的别名生效,要想普通用户有效,普通用户目录下的.bashrc也必需作同样的修改!比如现在有用户为 jerry,则需要到其/home/jerry/.bashrc下编辑然后执行source ~/.bashrc )。

  1. ##pdl用户登录,在/home/pdl加目录下 或者 "~"及代表用户的家目录
  2. ## /home/pdl/.bashrc 某行添加
  3. ## alias homeview='ll ~'
  4. ##添加
  5. pdl@Test-old-web01:~$ vim /home/pdl/.bashrc
  6. ##重新加载别名文件
  7. pdl@Test-old-web01:~$ source ~/.bashrc
  8. ##执行homeview 即相当于 执行 ll ~
  9. pdl@Test-old-web01:~$ homeview
  10. total 36
  11. drwx------ 4 pdl  pdl  4096 Feb  6 15:10 ./
  12. drwxr-xr-x 5 root root 4096 Dec 30 11:18 ../
  13. -rw------- 1 pdl  pdl  1114 Nov 21 16:54 .bash_history
  14. -rw-r--r-- 1 pdl  pdl   220 Sep  1  2015 .bash_logout
  15. -rw-r--r-- 1 pdl  pdl  3795 Feb  6 15:10 .bashrc
  16. drwx------ 2 pdl  pdl  4096 Aug 22 09:00 .cache/
  17. -rw-r--r-- 1 pdl  pdl   655 May 16  2017 .profile
  18. drwx------ 2 pdl  pdl  4096 Aug 22 15:11 .ssh/
  19. -rw------- 1 pdl  pdl  1016 Feb  6 15:10 .viminfo
  20. ##退出终端重新加载,发现别名homeview永久存在

    实际用例:假设生产环境有三台机器127.1.1.2127.1.1.3127.1.1.4 ; 你可以通过 alias 的方式简化 ssh 登录方式,操作如下:     在~/.bashrc下末尾行追加内容。然后 source ~/.bashrc ,这样即可以在命令行直接输入 ssh_01,ssh_02,ssh_03快速登陆。

  1. alias ssh_01= 'sshpass -p 密码 ssh -o StrictHostKeyChecking=no -p 22  root@127.1.2'

  2. alias ssh_02= 'sshpass -p pass2 ssh -o StrictHostKeyChecking=no -p 22  root@127.1.1.3'

  3. alias ssh_03= 'sshpass -p pass4 ssh -o StrictHostKeyChecking=no -p 22  root@127.1.1.4'

实践要求

     本关没有评测,希望大家独立在命令行按照示例自己操作一遍,了解熟悉 shell 的内置命令,并掌握 alias 的使用方式以及应用场景。

任务描述

    本关继续为大家介绍 shell 的内置命令 echo 和 read,通过学习掌握 echo 和 read 的用法。

相关知识

内置命令——echo

     echo 是一个 Shell 内建命令,用来在终端输出字符串,并在最后默认加上换行符。请看下面的例子:

  1. #!/bin/bash
  2. name="在线编程"
  3. url="www.educoder.net"
  4. echo "小哥哥,小姐姐,你好!"  #直接输出字符串
  5. echo $url  #输出变量
  6. echo "${name}的网址是:${url}"  #双引号包围的字符串中可以解析变量
  7. echo '${name}的网址是:${url}'  #单引号包围的字符串中不能解析变量

     输出结果为:

  1. [root@pre-host-work02 opt]# bash a.sh
  2. 小哥哥,小姐姐,你好!
  3. www.educoder.net
  4. 在线编程的网址是:www.educoder.net

    echo 命令输出结束后默认会换行,如果不希望换行,可以加上-n参数,如下所示:

  1. #!/bin/bash
  2. name="在线编程"
  3. url="www.educoder.net"
  4. echo -n "小哥哥,小姐姐,你好!"  #直接输出字符串
  5. echo -n $url  #输出变量
  6. echo  "${name}的网址是:${url}"  #双引号包围的字符串中可以解析变量

  输出结果为:

  1. [root@pre-host-work02 opt]# bash a.sh
  2. 小哥哥,小姐姐,你好!www.educoder.net在线编程的网址是:www.educoder.net

     默认情况下,echo 不会解析以反斜杠\开头的转义字符。比如,\n表示换行,echo 默认会将它作为普通字符对待。请看下面的例子:

  1. [root@localhost ~]# echo "hello \nworld"
  2. hello \nworld

    我们可以添加-e参数来让 echo 命令解析转义字符。例如:

  1. [root@localhost ~]# echo -e "hello \nworld"
  2. hello
  3. world
内置变量——read

    read 是 Shell 内置命令,用来从标准输入中读取数据并赋值给变量。如果没有进行重定向,默认就是从键盘读取用户输入的数据;如果进行了重定向,那么可以从文件中读取数据(后续我们会在 shell 的输入和输出中深入讲解重定向的概念,不了解的同学可以不用理会,暂时就认为:read 命令就是从键盘读取数据)。
    read 命令的用法为:

  1.    read [-options] [variables]

    options 表示选项,如下表所示;variables 表示用来存储数据的变量,可以有一个,也可以有多个。

    options 和 variables 都是可选的,如果没有提供变量名,那么读取的数据将存放到环境变量 REPLY 中。     Shell read 命令支持的选项:

    【实例1】使用 read 命令给多个变量赋值,并打印提示语 read -p

  1. #!/bin/bash
  2. read -p "Enter some information > " name age
  3. echo "网站名字:$name"
  4. echo "年龄:$age"

    输出结果为:

  1. [root@pre-host-work02 opt]# bash a.sh
  2. Enter some information > educoder 20
  3. 网站名字:educoder
  4. 年龄:20

    Tips: 如果用 read 交互参数,输入错了,请按住Ctrl+Backspace清除而不是只按住Backspace。

    【示例2】只读取一个字符。

  1. #!/bin/bash
  2. read -n 1 -p "Enter a char > " char
  3. printf "\n"  #换行
  4. echo $char

    运行结果:

  1.    Enter a char > 1
  2.    1
相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
目录
相关文章
|
1天前
|
存储 缓存 Java
性能分析之构建 Linux 操作系统分析决策树
【8月更文挑战第16天】性能分析之构建 Linux 操作系统分析决策树
7 0
性能分析之构建 Linux 操作系统分析决策树
|
7天前
|
编解码 安全 Linux
基于arm64架构国产操作系统|Linux下的RTMP|RTSP低延时直播播放器开发探究
这段内容讲述了国产操作系统背景下,大牛直播SDK针对国产操作系统与Linux平台发布的RTMP/RTSP直播播放SDK。此SDK支持arm64架构,基于X协议输出视频,采用PulseAudio和Alsa Lib处理音频,具备实时静音、快照、缓冲时间设定等功能,并支持H.265编码格式。此外,提供了示例代码展示如何实现多实例播放器的创建与管理,包括窗口布局调整、事件监听、视频分辨率变化和实时快照回调等关键功能。这一技术实现有助于提高直播服务的稳定性和响应速度,适应国产操作系统在各行业中的应用需求。
|
16天前
|
监控 Shell Linux
探索Linux操作系统下的Shell编程之魅力
【8月更文挑战第4天】本文旨在通过一系列精心设计的示例和分析,揭示在Linux环境下进行Shell编程的独特之处及其强大功能。我们将从基础语法入手,逐步深入到脚本的编写与执行,最终通过实际代码案例展现Shell编程在日常系统管理和自动化任务中的应用价值。文章不仅适合初学者构建扎实的基础,同时也为有一定经验的开发者提供进阶技巧。
29 11
|
1月前
|
弹性计算 运维
阿里云操作系统智能助手OS Copilot实验测评报告
**OS Copilot 产品体验与功能反馈摘要** 运维人员发现OS Copilot易上手,文档清晰,助其高效排查故障(8/10分)。愿意推荐并参与开源开发。亮点在于知识问答,能快速筛选答案。相较于竞品,优点是新手友好、文档清晰,但功能扩展性待增强。期望增加系统错误排查与解决方案,并集成ECS等,以优化系统安装流程。
阿里云操作系统智能助手OS Copilot实验测评报告
|
3天前
|
Shell Linux 程序员
详解shell 运行原理及Linux权限
详解shell 运行原理及Linux权限
|
7天前
|
安全 Linux Windows
【Linux】Linux操作系统
【Linux】Linux操作系统
|
1月前
|
弹性计算 运维 自然语言处理
阿里云OS Copilot测评:重塑Linux运维与开发体验的智能革命
阿里云OS Copilot巧妙地将大语言模型的自然语言处理能力与操作系统团队的深厚经验相结合,支持自然语言问答、辅助命令执行等功能,为Linux用户带来了前所未有的智能运维与开发体验。
|
1月前
|
Shell Linux C语言
|
1月前
|
弹性计算 运维 自然语言处理
阿里云操作系统智能助手OS Copilot实验测评报告
OS Copilot是针对Linux的智能助手,助力学习、运维及编程。用户界面直观,自然语言交互方便新手。官方文档详尽,但初次配置略复杂,适合学生和开发者。在提高代码编写和调试效率、系统学习上得分高,功能亮点包括代码生成、问答和命令执行。用户期待更多操作系统支持、自动错误分析和系统排查功能。
173 3
|
16天前
|
监控 Linux Shell
探索Linux操作系统下的进程管理
【8月更文挑战第4天】本文深入探讨了在Linux操作系统下进行进程管理的方法与技巧,通过实例分析展示了如何利用系统命令和脚本来监控、控制进程。文中不仅介绍了基础的进程查看、启动、终止操作,还详细解释了如何通过信号机制处理进程间的通信,以及如何编写自动化脚本以优化日常管理任务。文章旨在为系统管理员和开发人员提供实用的进程管理知识,帮助他们更高效地维护Linux系统。

热门文章

最新文章