小白学超算之Linux基础(4)

接下来,我们继续学习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环境中的数值运算,默认最多仅能到达整数形态,因此在计算中“ / ”可视为整除。如下是通过变量进行计算的范例。

 变量内容的删除与替换

变量内容的删除

变量内容的替换


参考

  1. Shell与Bash的区别和联系:Linux基础篇(一)-- Shell与Bash的区别和联系_shell和bash的区别-CSDN博客

  2. linux命令别名:linux命令别名_linux 命令别名-CSDN博客

  3. The Missing Semester of Your CS Education:计算机教育中缺失的一课 · the missing semester of your cs education

  4. Linux执行脚本的两种方法:【Linux】执行脚本的两种方法,sh xx.sh和直接./xx.sh的区别-CSDN博客

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值