重定向
- 标准输入重定向(STDIN,文件描述符为0):是指把文件导入命令中
- 输出重定向:把原本要输出到屏幕的数据信息写入指定文件中
- 两种技术
标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕,文件存在,内容包括文件的权限,所有者,所属组,文件大小及修改时间等信息。
[dell@bogon scripts]$ ls -l README.md
-rw-rw-r-- 1 dell dell 477 Jan 18 19:48 README.md
错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕,文件不存在,输出报错信息
[dell@bogon scripts]$ ls -l no.md
ls: cannot access no.md: No such file or directory
- 两种模式
① 清空写入
② 追加写入
输入重定向符号
- 命令 < 文件:将文件作为命令的标准输入
- 命令 << 分界符:从标准输入中读入,直到遇见分界符为止
- 命令 < 文件1 > 文件2:将文件1作为命令的标准输入并将标准输出到文件2
[dell@bogon ~]$ wc -l < readme.txt
2
[dell@bogon ~]$ cat readme.txt | wc -l
2
输出重定向符号
- 命令 > 文件:将标准输出重定向到一个文件(清空原有文件的数据)
- 命令 2> 文件:将错误输出重定向到一个文件(清空原有文件的数据)
- 命令 >> 文件:将标准输出重定向到一个文件(追加到原有内容之后)
- 命令 2>> 文件:将错误输出重定向到一个文件(追加到原有内容之后)
- 命令 >> 文件 2>&1:将标准输出和错误输出共同写入到文件中(追加到原有内容之后)
- 命令 &>> 文件:将标准输出和错误输出共同写入到文件中(追加到原有内容之后)
对于重定向中的标准输出模式,可以省略文件描述符1不写,而错误输出模式的文件描述2必须要写
[dell@bogon ~]$ man bash > readme.txt
[dell@bogon ~]$ more readme.txt
[dell@bogon ~]$ echo "welcome to China" > readme.txt#覆盖写入
[dell@bogon ~]$ echo "quality is important" >> readme.txt#追加写入
[dell@bogon ~]$ cat readme.txt
welcome to China
quality is important
对于存在的文件,标准输出可以将信息写入文件中,而错误输出重定向则把信息输出到屏幕
[dell@bogon ~]$ ls -l readme.txt > /home/dell/try.txt
[dell@bogon ~]$ ls -l readme.txt 2> /home/dell/try.txt
-rw-rw-r-- 1 dell dell 38 1月 20 09:26 readme.txt
当用户在执行一个自动化的shell脚本时,需要把命令的报错信息写入到文件中,有利于后续排错
[dell@bogon ~]$ ls -l xxxx.txt
ls: 无法访问xxxx.txt: 没有那个文件或目录
[dell@bogon ~]$ ls -l xxxx.txt > /home/dell/try.txt
ls: 无法访问xxxx.txt: 没有那个文件或目录
[dell@bogon ~]$ ls -l xxxx.txt 2> /home/dell/try.txt
[dell@bogon ~]$ cat try.txt
ls: 无法访问xxxx.txt: 没有那个文件或目录
管道命令符
格式:“命令A | 命令B”
管道命令符:把前一个命令本来要输出到屏幕的标准正常数据当做是后一个命令的标准输入
[dell@bogon ~]$ grep "/sbin/nologin" /etc/passwd | wc -l
40
#找出禁止登陆的账号
修改用户密码时,通常都需要输入两次密码以进行确认,这在编写自动化脚本时成为缺陷。通过passwd --stdin结合,可以一次完成命令重置操作
[root@bogon ~]# echo "12345678" | passwd --stdin zhs
更改用户 zhs 的密码 。
passwd:所有的身份验证令牌已经成功更新。
命令行的通配符
星号(*) 代表匹配零个或多个字符
?代表匹配单个字符
[0-9] 代表匹配0-9之间的单个数字的字符
[abc] 代表匹配a\b\c三个字符中的任意一个字符
硬盘设备文件都是以sda开头并存放在/dev目录中
[dell@bogon ~]$ ls -l /dev/sda*
brw-rw---- 1 root disk 8, 0 Dec 28 22:34 /dev/sda
brw-rw---- 1 root disk 8, 1 Dec 28 22:34 /dev/sda1
转义字符
4个最常用的转义字符
- 反斜杠(\):使反斜杠后面的变量变为单纯的字符串
- 单引号(''):转义其中所有的变量为单纯的字符串
- 双引号(""):保留其中的变量属性,不进行转义处理
- 反引号(``):把其中的命令执行后返回结果
[dell@bogon ~]$ PRICE = 5
bash: PRICE: 未找到命令...
[dell@bogon ~]$ PRICE=5
[dell@bogon ~]$ echo "price is $PRICE"
price is 5
注意空格!
5”
[dell@bogon ~]$ echo "price is $$PRICE"
price is 286204PRICE
原来$$的作用是显示当前程序的进程ID号码
如果想让第一个$作为美元符号,需要\来进行转义,使其变为单纯的文本
[dell@bogon ~]$ echo "price is \$$PRICE"
price is $5
如果只需要某个命令的输出值时,可以像命令
这样,将命令用反引号括起来,达到预期的效果。
[dell@bogon ~]$ echo `uname -a`
Linux bogon 3.10.0-1160.49.1.el7.x86_64 #1 SMP Tue Nov 30 15:51:32 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
[dell@bogon ~]$ uname -a
Linux bogon 3.10.0-1160.49.1.el7.x86_64 #1 SMP Tue Nov 30 15:51:32 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
环境变量
变量是计算机系统用于保存可变值的数据类型。在Linux中,变量名称一般都是大写的。我们可以直接通过变量名称来提取到对应的变量值。
Linux中环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录、邮件存放位置等。
命令在Linux中执行分为四个步骤:
- 判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是的话则直接执行
- 检查用户输入的命令是否为“别名命令”,即用一个自定义的命令名称来替换原本命令名称。
“alias 别名=命令”:创建一个属于自己的命令别名
“unalias 别名=命令”: 取消一个命令别名 - Bash解释器判断用户输入的是内部命令还是外部命令。内部命令是解释器内部的命令,会被直接执行;而用户在绝大部分时间输入的是外部命令,进行步骤4。
“type 命令名称”来判断是外部还是内部命令
[dell@bogon ~]$ type rm
rm 已被哈希 (/usr/bin/rm)
[dell@bogon ~]$ type R
R 是 /opt/R/4.0.5/bin/R
- 系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量就叫做PATH,可以将其理解为“解释器的助手”,作用是告诉Bash解释器待执行的命令可能存放的位置,然后BASH解释器就会在这些位置中逐个查找。PATH是由多个路径值组成的变量,每个路径值用冒号隔开,对这些路径的增加和删除操作将影响到Bash解释器对Linux的查找。
Linux系统中最重要的10个环境变量
HOME:家目录
SHELL:用户在适用的shell解释器的名称
[myh@bogon ~]$ echo $SHELL
/bin/bash
HISTSIZE:输出的历史命令记录条数
HISTFILESIZE:保存的历史命令的记录条数
MAIL:邮件保存路径
[dell@bogon ~]$ echo $MAIL
/var/spool/mail/dell
LANG:系统语言、语系名称
RANDOM:生成一个随机数字
[dell@bogon ~]$ echo $RANDOM
24456
PSL:Bash解释器的提示符
PATH:定义解释器搜索用户执行命令的路径
EDITOR:用户默认的文本编辑器
Linux可以为每个用户提供独立的、合适的工作运行环境。因此一个相同的变量会因为用户身份的不同而具有不同的值。
其实变量是由固定的变量名与用户或系统设置的变量值两部分组成的,我们可以执行创建变量。
单独创建的变量不具有全局性,作用范围也有限,默认情况下不能被其他用户使用。如果工作需要,可以将export命令提升为全局变量
WORKDIR=/home/workdir
export WORKDIR
网友评论