接下来,我们继续学习bash的数据流重导向与管线命令。在此,也默认虚拟机等必要环境都已配备完毕,接下来我将以VMware虚拟机环境下的CentOS 7系统为例,并搭配MobaXterm远程计算工具箱进行学习。本博客的参考资料为鸟哥的《Linux私房菜:基础版》以及黑马程序员的Linux课程笔记(主要用于基本命令的查阅)。同时,在介绍完知识点后,将完成来自GitHub的课程The Missing Semester of Your CS Education提供的练习。
数据流重导向
作用与功能
要讲到数据流重导向,我们首先先要明确一个指令执行过程的数据传输情况。根据下图不难看出,当我们执行一个指令的时候,这个指令可能会由文件读入数据,经过处理之后,再将数据输出到屏幕上。可此时,无论标准输出(standard output)还是标准错误输出(standard error output)的数据都是默认输出到屏幕上的,因此我们便要依靠数据流重导向将这两股数据分开!
数据流重导向可以将 standard output (简称 stdout) 与 standard error output (简称 stderr) 分别传送到其他的文件或设备去,而分别传送所用的特殊字符则如下所示:
- 标准输入 (stdin) :代码为 0 ,使用 < 或 << ;
- 标准输出 (stdout):代码为 1 ,使用 > 或 >> ;
- 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ;
变量的设置
变量的设置也相当简单,直接输入 变量名称+"="+变量内容 即可设置变量。而在bash中,如果我们去echo一个未设置的变量,它会返回一个空值,而在其他某些shell中,则可能会发生报错。下面是一个简单的变量赋值案例。
设置变量是需要遵循一定的规则的,比如我们都知道,在C/C++中,为变量赋值需要先标明它的数据类型,而在python中则不需要。而在bash中,我们在设置变量时需要遵循如下规则:
- "="两边不能接空白字符,即等号两边不能有空格
- 变量名称只能由字母和数字组成(注意这里并没有提到下划线"_"),且开头必须为字母
- 变量内容的空白字符可以用" "或者' '将变量内容结合起来,但" "不改变特殊字符的特性,而' '内的内容被视为纯文本,如下图例所示。
- 可以使用跳脱字符 \ 将特殊字符变为普通字符(主要用于空白字符、制表符和换行符)
- 需要在变量中调用其他指令时,可以使用` `或 $ ,如下图所示。
- 若该变量为扩增变量内容时,则可用 "$变量名称" 或 ${变量} 累加内容,如:
PATH="$PATH":/home/bin
PATH=${PATH}:/home/bin
- 若该变量需要在其他子程序执行,则需要以 export 来使变量变成环境变量
- 通常大写字符为系统默认变量,自行设置变量可以使用小写字符,方便判断
- 取消变量的方法为“ unset 变量名称 ”
环境变量的功能
查阅环境变量
我们可以使用 env 或者 export 指令查阅所有的默认环境变量,下面我们将解释这些环境变量的功用。
- HOME:代表使用者的主文件夹。 cd ~ 去到自己的主文件夹,就是取用这个变量。
- SHELL:标明目前这个环境使用的shell是哪支程。Linux 默认使用 /bin/bash 。
- HISTSIZE:与“历史命令”有关,即我们曾经下达过的指令可以被系统记录下 来,而记录的条数则是由这个值来设置的。
- MAIL:当我们使用 mail 这个指令在收信时,系统会去读取的邮件信箱文件 mailbox 。
- PATH:可执行文件搜寻的路径。目录与目录中间以冒号( : )分隔, 文件搜寻是依序由 PATH 的变量内的目录来查询的。
- LANG:语系数据。一般来说,我们中文编码通常是 zh_TW.Big5 或者是 zh_TW.UTF-8 。
- RANDOM:生成随机乱数的变量。目前大多数的 distributions 都会有随机数产生器,即 /dev/random 这个文件。 我们可以通过相关的变量 $RANDOM 来获得随机数。在BASH的环境下,该变量的内容,介于0~32767之间。同时,我们可以利用 declare 宣告数值类型生成任意范围的随机数,如下图示范了如何生成1~100的随机数:
此外,我们还可以用 set 指令查阅所有变量,即系统变量与自定义变量。
其他重要系统变量
系统变量,实际上就是与shell的操作接口有关的变量,除了环境变量外,还有一些重要的变量,下面我将介绍其中的几个。
- PS1:提示字符的设置 。通过改变特定参数,可以改变命令行前置的提示字符类型,其默认内容为 [\u@\h \W]\$ ,比较有用的操作是将W改为w,即可实现提示符提示当前的完整路径。
- $:代表目前shell的线程代号(PID)。
- ?:代表上个执行指令的回传值。
- export:自定义变量转为环境变量。
- locale:影响显示结果的语系变量。
变量的读取与宣告
- read:读取来自键盘输入的变量
下面将举几个不同语言实现相同功能的例子,相信大家可以一目了然!
#C
char name[20];
printf("Please keyin your name: \n");
gets(name);
#C++
string name;
cout << "Please keyin your name: " << endl;
getline(cin,name);
#Python
print("Please keyin your name: ")
name = input()
#Bash
read -p "Please keyin your name: " name
以上全部都是在给出提示词的情况下,从键盘输入内容到 name 变量中。而bash除了能实现如上功能之外,还可以通过修改参数设置等待输入时间,一旦超过该时间则自动退出至命令行。如下方代码设置输入时间为10s。
#Bash
read -p "Please keyin your name: " -t 10 name
- declare/typeset:宣告变量的类型
在bash环境中,变量类型都默认为字符串,因此需要利用declare去进行变量类型的宣告以进行运算等操作,接下来对declare的可变参数进行解释:
- -a:将变量定义为阵列(array)类型
- -i:将变量定义为整型(integer)
- -x:作用同 export ,将变量转换为环境变量
- -r:将变量设置成为 readonly 类型,该变量变为只读变量,不可被更改内容,也不能 unset
同时,要注意bash环境中的数值运算,默认最多仅能到达整数形态,因此在计算中“ / ”可视为整除。如下是通过变量进行计算的范例。
变量内容的删除与替换
变量内容的删除
变量内容的替换
参考
-
Shell与Bash的区别和联系:Linux基础篇(一)-- Shell与Bash的区别和联系_shell和bash的区别-CSDN博客
-
linux命令别名:linux命令别名_linux 命令别名-CSDN博客
-
The Missing Semester of Your CS Education:计算机教育中缺失的一课 · the missing semester of your cs education
-
Linux执行脚本的两种方法:【Linux】执行脚本的两种方法,sh xx.sh和直接./xx.sh的区别-CSDN博客