type
slug
status
summary
icon
category
date
tags
password
Shell的两大功能
- 命令解释器:解释用户发出的各种操作系统命令
- 程序设计语言: 功能强大, 可包容引用所有的操作系统命令和可执行程序。
8.2 输入输出重定向和管道

8.2.1 标准输出重定向


8.2.2 标准输入重定向


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

8.2.4 标准错误输出重定向


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


8.3 shell 可识别的命令形式
8.3.1 单条命令
这是最常用命令形式, 本命令执行完成后出现shell提示符, 再接收下一条键盘命令.
8.3.2 多条命令
- 第一条命令执行完成后, (无停顿)再执行第二条命令, 如此下去. 运行功能和效果与在键盘上逐条输入命令并运行是完全一样的, 其主要目的是提高键盘命令输入效率.
8.3.3 复合命令
括号内的命令任意组合、顺序执行,且由一个子shell来单独控制运行, 相当于一个小的功能程序. 方便灵活, 运行效率高.
8.4 shell 变量和引用符
8.4.1 环境变量

8.4.2 echo 命令的使用



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



echo命令
- echo命令的基本功能就是在标准输出上显示后面的字符串,或变量的值。当字符串中带空白符或其它控制字符时,用引号将其括起来。
Shell注释
以#开头
变量定义
shell编程中,定义变量是直接定义的,没有明确的数据类型,shell允许用户建立变量存储数据,但是认为赋给变量的值都解释为一串字符
shell中,英文符号
"$"
用于取变量值!!
如果需要在变量中使用系统命令,需要加上”`“符号(ESC键下方)
使用变量
使用变量的时,用英文符号
"$"
取变量值,对于较长的变量名,建议加上{ }
花括号,帮助解释器识别变量的边界,如下变量操作
shell中的变量,默认为可读可写类型,如果想要其只可读,如同url一样,需要将其声明为**只读类型变量(**如同
const
),使用readonly
命令,如下脚本如果想要删除变量,使用
unset
命令解除命令赋值,但是unset
不能删除可读变量,如下所示Shell字符串
最好使用双引号
shell规定单引号禁止变量替换, 元字符$和*等保持其符号本身; 而双引号允许元字符变量替换.


字符串操作
获得字符串长度
在对变量进行取值时,使用" # "符号对字符串进行取值
提取子字符串
使用字符串的截取命令,用于提取部分字符串
查找字符串
用于查找字符的位置,输出结果为字符在字符串中所占的数据位置,如果查找多个字符,那哪个字母先出现就计算哪个,如下查找
it
中i
和t
两个字符,t
先出现,输出为1- 查找某个字符集合中任意一个字符第一次出现在字符串中的位置
表达式 | 解释 |
expr index "$str" chars | 找到 chars 中任意一个字符第一次出现在 str 中的位置(从 1 开始) |

- ``反撇号:在Shell 中执行一个命令,并把它的执行结果(也就是输出)当作值替换到命令中。
- 这会执行date命令,并把结果(值)插入到echo中
写法 | 意义 |
`command` | 执行命令,并把结果替换进来(老写法) |
$(command) | 执行命令,并把结果替换进来(推荐) |
Shell数组
shell数组只支持一维数组!!!
定义数组
在 Shell 中,用括号
()
来定义表示数组,数组中元素用"空格"符号分割开。定义数组的一般形式为:读取数组
- 和读取变量名相同,使用
$
符号,需要加上下标名
获取数组长度
Shell参数传递









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

关系运算符

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

逻辑运算符

注意这里是两个[[]]才会返回bool值
字符运算符

文件测试运算符

Shell编程中的命令
echo命令

cat命令

read命令


n
参数表示:输出内容后不换行,光标留在同一行。
expr命令

tput命令
- tput命令主要用于设置终端工作模式, 或读出终端控制字符。 tput命令与终端控制代码数据库terminfo相连, 根据shell环境变量TERM的值, 读出这种终端的指定功能控制代码。常用的终端显示功能控制符如下表:

该程序先清屏, 并在屏幕中央位置(11行30列)用反极性显示字符串“Hello, everybody!”, 恢复正常显示极性后光标停留在屏幕左下角。
功能: 响一声铃后, 在清空的屏幕中央以下划线模式显示字符串“Computer Department”,完成后重置正常显示模式。
条件语句

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


应用实例: shell程序prog3, 用法为: prog3 file
prog3的内容如下:
系统变量

测试语句


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

实例. 程序prog4检查用户输入的文件名, 用法为: prog4 string_name
循环语句

- 循环次数是单词表中的单词数
实例:包含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中。



一些概念题






- 作者:🐟🐟
- 链接:https://www.imyuyu.top//article/OS/Chapter7
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。