type
slug
status
summary
icon
category
date
tags
password

Shell的两大功能

  • 命令解释器:解释用户发出的各种操作系统命令
  • 程序设计语言: 功能强大, 可包容引用所有的操作系统命令和可执行程序。
 

8.2 输入输出重定向和管道

notion image
 

8.2.1 标准输出重定向

notion image
notion image
 

8.2.2 标准输入重定向

notion image
 
notion image

8.2.3 常见标准输入输出重定向形式

notion image

8.2.4 标准错误输出重定向

notion image
notion image

8.2.5 管道

管道用于连接两个命令, 它把前一个命令的标准输出重定向给后一个命令作为其标准输入, 其格式为:
对command1来说标准输出被重新定向到管道, 对command2来说标准输入也被重新定向为管道.
notion image
notion image

8.3 shell 可识别的命令形式

8.3.1 单条命令

这是最常用命令形式, 本命令执行完成后出现shell提示符, 再接收下一条键盘命令.

8.3.2 多条命令

  • 第一条命令执行完成后, (无停顿)再执行第二条命令, 如此下去. 运行功能和效果与在键盘上逐条输入命令并运行是完全一样的, 其主要目的是提高键盘命令输入效率.

8.3.3 复合命令

括号内的命令任意组合、顺序执行,且由一个子shell来单独控制运行, 相当于一个小的功能程序. 方便灵活, 运行效率高.
 

8.4 shell 变量和引用符

8.4.1 环境变量

notion image

8.4.2 echo 命令的使用

notion image
notion image
notion image

8.4.3 局部变量(用户变量)

局部变量是由用户根据需要任意创建的. 变量名通常由一个字母后跟零个到多个字母、数字或下划线组成。引用变量的值时,在变量名前面加上$符号. 例如:

8.4.4 单引号、双引号、反撇号和花括号

notion image
notion image
notion image
 

echo命令

  • echo命令的基本功能就是在标准输出上显示后面的字符串,或变量的值。当字符串中带空白符或其它控制字符时,用引号将其括起来。

Shell注释

以#开头

变量定义

shell编程中,定义变量是直接定义的,没有明确的数据类型,shell允许用户建立变量存储数据,但是认为赋给变量的值都解释为一串字符
shell中,英文符号"$"用于取变量值!!
notion image
如果需要在变量中使用系统命令,需要加上”`“符号(ESC键下方)

使用变量

使用变量的时,用英文符号"$"取变量值,对于较长的变量名,建议加上{ }花括号,帮助解释器识别变量的边界,如下

变量操作

shell中的变量,默认为可读可写类型,如果想要其只可读,如同url一样,需要将其声明为**只读类型变量(**如同const),使用readonly命令,如下脚本
如果想要删除变量,使用unset命令解除命令赋值,但是unset不能删除可读变量,如下所示

Shell字符串

最好使用双引号
shell规定单引号禁止变量替换, 元字符$和*等保持其符号本身; 而双引号允许元字符变量替换.
notion image
notion image

字符串操作

获得字符串长度

在对变量进行取值时,使用" # "符号对字符串进行取值

提取子字符串

使用字符串的截取命令,用于提取部分字符串

查找字符串

用于查找字符的位置,输出结果为字符在字符串中所占的数据位置,如果查找多个字符,那哪个字母先出现就计算哪个,如下查找itit两个字符,t先出现,输出为1
  • 查找某个字符集合中任意一个字符第一次出现在字符串中的位置
表达式
解释
expr index "$str" chars
找到 chars 中任意一个字符第一次出现在 str 中的位置(从 1 开始)
notion image
  • ``反撇号:在Shell 中执行一个命令,并把它的执行结果(也就是输出)当作值替换到命令中
    • 这会执行date命令,并把结果(值)插入到echo中
    • 写法
      意义
      `command`
      执行命令,并把结果替换进来(老写法)
      $(command)
      执行命令,并把结果替换进来(推荐)

Shell数组

shell数组只支持一维数组!!!

定义数组

在 Shell 中,用括号()来定义表示数组,数组中元素用"空格"符号分割开。定义数组的一般形式为:

读取数组

  • 和读取变量名相同,使用$符号,需要加上下标名

获取数组长度

Shell参数传递

notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
 

Shell运算符

  • 算数运算符
  • 关系运算符
  • 布尔运算符
  • 逻辑运算符
  • 字符串运算符
  • 文件测试运算符
shell想要使用这些运算符,需要结合其他命令和工具来使用(因为shell中不支持简单的数学运算),如使用算符运算符就需要搭配的常用的工具有两种
  • awk
  • expr(使用频繁)
运算规则注意点
  • 表达式和运算符之间必须要有空格,例如 3+2 是不对的,必须写成 3 + 2
  • 完整的表达式要被 两个" ` "包含在 Esc 键下边那个键

算数运算符

notion image
 

关系运算符

notion image
注意:运算符和数之间必须要用空格隔开
 

bool运算符

notion image
 

逻辑运算符

notion image
注意这里是两个[[]]才会返回bool值
 

字符运算符

notion image
 

文件测试运算符

notion image
 

Shell编程中的命令

echo命令

notion image

cat命令

notion image
 

read命令

notion image
notion image
  • n 参数表示:输出内容后不换行,光标留在同一行。

expr命令

notion image
 

tput命令

  • tput命令主要用于设置终端工作模式, 或读出终端控制字符。 tput命令与终端控制代码数据库terminfo相连, 根据shell环境变量TERM的值, 读出这种终端的指定功能控制代码。常用的终端显示功能控制符如下表:
notion image
该程序先清屏, 并在屏幕中央位置(11行30列)用反极性显示字符串“Hello, everybody!”, 恢复正常显示极性后光标停留在屏幕左下角。
功能: 响一声铃后, 在清空的屏幕中央以下划线模式显示字符串“Computer Department”,完成后重置正常显示模式。
 

条件语句

notion image
  • 如果表达式为真, 则执行命令表中的命令; 否则退出if语句, 即执行fi后面的语句。
  • 如果表达式为真, 则执行命令表1中的命令, 退出if语句; 否则执行命令表2中的语句, 退出if语句。
  • if和fi是条件语句的语句括号, 必须成对使用。
  • 命令表中的命令可以是一条, 也可以是若干条; 既可以直接在then语句后面写, 也可以提行书写。
if语句应用实例 shell程序prog2, 测试命令行参数是否为一个已存在的文件或目录。 用法为: prog2 file。
prog2脚本内容如下:
  • d 是目录测试运算符,意思是“如果路径是一个存在的目录”
  • $HOME 是用户的主目录(比如 /home/username
  • 所以这行是在判断:用户主目录下是否有名为 $1 的目录
if [-d $HOME/$1]
notion image
notion image
应用实例: shell程序prog3, 用法为: prog3 file prog3的内容如下:
 
 
 

系统变量

notion image

测试语句

notion image
notion image

多路分支语句case…esac(case反写)

notion image
实例. 程序prog4检查用户输入的文件名, 用法为: prog4 string_name
 
 

循环语句

notion image
  • 循环次数是单词表中的单词数
实例:包含for语句的程序prog5寻找指定文件,拷贝当前目录下的所有文件到backup子目录下. 使用语法及程序为: prog5 [filename]
  • 详细代码分析
    • 判断用户目录下是否存在名为 backup 的目录
    • 如果没有,那么就创建一个目录。mkdir $HOME/backup
    • 获得当前目录下的文件列表
    • 遍历当前目录下的所有文件/目录
    • 每次循环file取一个文件名,如果传了一个参数,即寻找这类的文件,那么当参数=文件名时就输出文文件已经找到。
    • 如果没有传入参数,就执行文件复制操作
    • 把当前目录下的文件复制到 ~/backup/ 目录,并提示
 

break和continue

  • break语句从包含该语句的最近一层循环中跳出一层, break n 则跳出n层; continue语句则马上转到最近一层循环语句的下一轮循环上, continue n则转到最近n层循环语句的下一轮循环上.
实例. 程序prog7的用法为:prog7 整数 整数 整数 …参数个数不确定, 参数的数量为1~10个, 每个参数都是正整数。用于检查命令行参数并输出其中的偶数。prog7的代码如下:
代码详细说明:
  • 如果传递给脚本的参数为0,那么久判断没有参数,退出脚本
  • 如果传递给脚本的参数大于10,那么输出提示信息,退出脚本
  • for number: 遍历传递给脚本的每个参数,将每个参数赋值给变量 number
  • count=expr numbernumber除以 2 的余数,并将结果存储在变量count中。
    • 如果if [ $count -eq 1 ]: 检查余数是否为 1(即奇数)。那么就转到下一次循环
    • 如果为偶数,那么将当前偶数添加到output 变量中,多个数字之间用空格分隔。
  • 输出所有偶数,格式为 "Even numbers:" 后跟所有偶数参数,多个偶数之间用空格分隔。

函数

在shell程序中, 常常把完成固定功能、且多次使用的一组命令(语句)封装在一个函数里,每当要使用该功能时只需调用该函数名即可。 函数在调用前必须先定义,即在顺序上函数说明必须放在调用程序的前面。 调用程序可传递参数给函数, 函数可用return语句把运行结果返回给调用程序。 函数只在当前shell中起作用, 不能输出到子shell中。
notion image
notion image
 
notion image
 
 
 
 
 
 
 
一些概念题
notion image
notion image
notion image
notion image
notion image
notion image
第六章:文件系统Hi3861 & 服创 & 计设
Loading...
🐟🐟
🐟🐟
在坚冰还盖着北海的时候,我看到了怒放的梅花
最新发布
1-4-1 USART串口协议
2025-6-27
2-6-1 uC/OSII 在STM32上的移植
2025-6-23
1-6 定时器与PWM
2025-6-21
一些工具
2025-6-21
第5章:链路层和局域网
2025-6-19
第4章:网络层
2025-6-19
公告
🎉 欢迎来到鱼鱼的博客~ 🎉
--- 很高兴认识你~ ---
👏一起成为理想中的自己吧!👏