2021-10-22

2021年10月23日 星期6 冷

============================================
“有舍必有的~” , 有时候想开、放开、给予,也是一种对自己的释怀吧,与其负重前行不如轻装上阵。

(三)管道符、重定向与环境变量

(3.1)输入输出重定向

重定向有三种种
标准输入重定向 < (STDIN,[standard input] 文件描述符为 0),可以从键盘输入,以可以从其他文件或者命令中输入

标准输出重定向 >> (STDOUT, [standard output] 文件描述符为1)
错误输出重定向 2>> (STDERR, [standard error]文件描述符为2)

标准输入一般指的是键盘输入
输入重定向:是指不使用系统提供的标准输入端口,而进行重新的指定。
< 将后面的文件中的内容作为输入交给前头的命令来处理。这就是所谓的 “将输入重定向到文件”,文件内容为输入内容

输入重定向
1、命令 < 文件

单纯的抽象理解,有时候真不好理解,查阅了很多资料,我想有实际应用就应该好理解了,举个例子

cat file 打印对应文件中的内容不再接收标准输入

cat < file 将文件的内容作为标准输入然后 cat 打印标准输入的内容

2、命令 << 分界符

其实这里的EOF只是End Of File的缩写只是更好理解

还有一点有输入就会有输出,输出无非有两种,一种标准输出(STDOUT),另外一种叫错误输出(STDERR),应用场景就是更具需求(要正确的还是错误的)将它们重定向到指定的文件中,然后做分析或者是舍弃操作。
3、命令 < 文件1 < 文件2

输出重定向的几种操纵符及其作用
1、命令 > 文件 将标准输出重定向到一个文件中(清空原文件的数据)
2、命令 2> 文件 将错误输出重定向到一个文件中 (清空原文件的数据)
3、命令 >> 文件 将标准输出重定向到一个文件中 (追加到原有内容的后面)
4、命令 2>> 文件 将错误输出重定向到一个文件中(追加到原有内容的后面)
5、命令 >> 文件 2>&1 或者 命令 &>> 文件
将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)

对于重定向中的标准输出模式,可以省略文件描述符1 不写,错误输出的模式的文件描述符2 是必须要写的

小实验理解 输入重定向和分界符 (EOF End Of File便于理解的解释,不是准确的)

[root@linuxprobe ~]# touch 1.txt 2.txt #创建 1 2 txt文件
[root@linuxprobe ~]# cat 1.txt 2.txt #同时查看 1 2 文件的内容为空
[root@linuxprobe ~]# cat << EOF >> 1.txt # 利用分界符,逐一输入 1 2 3 EOF结束输入,然后输入重定向并追到1.txt的文件里,本身1是没有内容的,通过输入重定向加给了 cat的内容

1
2
3
EOF
[root@linuxprobe ~]#

[root@linuxprobe ~]# cat << EOF >> 2.txt#同一 一样的操作

a
b
c
EOF
[root@linuxprobe ~]#

[root@linuxprobe ~]# cat 1.txt 2.txt #同时查看 1 和2 内容不同。
1
2
3
a
b
c

[root@linuxprobe ~]# cat < 1.txt >> 2.txt #把cat 1.txt的内容输入重定向到2.txt ,并追加
[root@linuxprobe ~]# cat 1.txt 2.txt #同时查看比较两个文件的不同,也可以用 deff 。
1
2
3
a
b
c
1
2
3
[root@linuxprobe ~]# diff --brief 1.txt 2.txt
Files 1.txt and 2.txt differ
[root@linuxprobe ~]# diff -c 1.txt 2.txt
*** 1.txt 2021-10-22 17:36:11.046138152 +0800
— 2.txt 2021-10-22 17:38:11.108140955 +0800
***************(文件创建时间不同)

*** 1,3 **** #第一个文件是1 列3行
— 1,6 ---- #第二个文件是1列6行

  • a #+ 号就是两个文件不同的内容(或者说第一个 文 件缺少的内容)
  • b
  • c
    1 #下面的就是他们相同的内容
    2
    3
    注释内容是我自己的理解,难免有误,可以查阅相关资料
    把比较的文件换个位置 就能看出
    [root@linuxprobe ~]# diff -c 2.txt 1.txt
    *** 2.txt 2021-10-22 17:38:11.108140955 +0800
    — 1.txt 2021-10-22 17:36:11.046138152 +0800

*** 1,6 ****

  • a #第一个文件多出来的内容
  • b
  • c
    1
    2
    3
    — 1,3 ----

输入重定向费了点时间和经历

(3.2)管道命令符 | (pipe)

管道符 “|”,还有个高大上的名字“任意门”
作用:把前一个命令原本要输出到屏幕的信息当作后一个命令的标准输入

理解了输入重定向,任意门就好理解了 直接实验试试
用grep命令搜索关键词/sbin/nologin 找出所有被限制登录的用户,通过/etc/passwd 这个文件搜索,结果会出来一大堆内容
[root@linuxprobe ~]# grep /sbin/nologin /etc/passwd
in❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
mail❌8:12:mail:/var/spool/mail:/sbin/nologin
operator❌11:0:operator:/root:/sbin/nologin
games❌12💯games:/usr/games:/sbin/nologin
ftp❌14:50:FTP User:/var/ftp:/sbin/nologin
nobody❌65534:65534:Kernel Overflow User:/:/sbin/nologin
dbus❌81:81:System message bus:/:/sbin/nologin
systemd-coredump❌999:997:systemd Core Dumper:/:/sbin

可以用一个命令管道符组合wc命令直接统计
[root@linuxprobe ~]# grep /sbin/nologin /etc/passwd | wc -l
40
常用案例:修改用户密需要两次确认,比较繁琐,利用passwd 加–stdin 和管道符直接修改
[root@linuxprobe ~]# echo “linuxproe” | passwd --stdin root
Changing password for user root.
passwd: all authentication tokens updated successfully.
[root@linuxprobe ~]# echo aaa | passwd --stdin root
Changing password for user root.
passwd: all authentication tokens updated successfully.

同时两次 echo 输出的内容有加引号和没引号,加双引号代表一个整体内容,输出的内容有空格,逗号,参数和变量中有空格最好是加引号。

tee命令

管道符可以多次使用,并不仅限于1行名只能用一次,而且利用管道符处理的结果可以用 tee 命令来输出到指定文件

例如查找某一进程 bash,并把进程写入 result.txt 文件

[root@linuxprobe ~]# ps aux | grep bash | tee result.txt
root 979 0.0 0.1 25384 2324 ? S 07:55 0:01 /bin/bash /usr/sbin/ksmtuned
root 3160 0.0 0.2 26900 5808 pts/0 Ss 08:54 0:02 bash
root 10641 0.0 0.0 12112 1092 pts/0 S+ 18:37 0:00 grep --color=auto bash
[root@linuxprobe ~]# cat result.txt
root 979 0.0 0.1 25384 2324 ? S 07:55 0:01 /bin/bash /usr/sbin/ksmtuned
root 3160 0.0 0.2 26900 5808 pts/0 Ss 08:54 0:02 bash
root 10641 0.0 0.0 12112 1092 pts/0 S+ 18:37 0:00 grep --color=auto bash

下一小节,命令行通配符

(3.3)命令行通配符 (wildcard)
通配符好理解一点,用特殊字符代替未知字母(大小写)、数字、字母数字混很、标点符号特殊字符等等,掌握统配方式就可以。
“*” 星号 通配任意字符,无穷多的值
“?” 单个任意字符
“[!]” 表示匹配不在方括号里面的字符(不包括空格) [^] 也可以这样表示
[a-z] 单个小写字母
[A-Z]单个大写字母
[a-Z]单个字母 可以是大小写混合
[0-9]单个数字

[[:alphp:]] 任意字母
[[:upper:]]任意大写字母
[[:lower:]]任意小写字母
[[:digit:]]所有数字
[[:alnum:]]任意字母加数字
[[:punct:]] 标点符号

“[ ]” 和 “{ }” 用中括号和大括号都能来表示,但有不同
“[ ]” (里面的内容是一个随机池子,是一个范围)
突然想起一个细节
在shell编程时,使用方括号表示测试条件的规则是:方括号两边必须有 空格 。
“{ }” 大括号里如果是多条信息,需要逗号隔开(里面的内容是一组数据)
“[ ]” 如果匹配不成功,会失去模式的功能,会变成一个单纯的字符串。
“{ }” 如果匹配不成功,会显示错误信息,或者当作字符串输出原有内容
[root@linuxprobe ~]# touch {aa,bb,cc}.conf
[root@linuxprobe ~]# ls
aa.conf
bb.conf
cc.conf
[root@linuxprobe ~]# touch [dd,zz].conf
[root@linuxprobe ~]# ls
‘[dd,zz].conf’
[root@linuxprobe ~]#

匹配目录
如果要匹配子目录里面的文件,可以写成下面这样。

$ ls */*.txt  

匹配文件名。

Bash 允许文件名使用通配符。这时,引用文件名的时候,需要把文件名放在单引号里面。

$ touch 'fo*' $ ls fo*

上面代码创建了一个fo文件,这时就是文件名的一部分。

实验
root@linuxprobe ~]# ls -l /dev/sd[a-Z]?
brw-rw----. 1 root disk 8, 1 Oct 21 23:31 /dev/sda1
brw-rw----. 1 root disk 8, 2 Oct 21 23:31 /dev/sda2
[root@linuxprobe ~]# ls -l /dev/sd[a-Z]?[[:digit]]
ls: cannot access ‘/dev/sd[a-Z]?[[:digit]]’: No such file or directory
[root@linuxprobe ~]# ls -l /dev/sd[a-Z][[:digit:]]
brw-rw----. 1 root disk 8, 1 Oct 21 23:31 /dev/sda1
brw-rw----. 1 root disk 8, 2 Oct 21 23:31 /dev/sda2
[root@linuxprobe ~]# ls -l /dev/s[[:alpha:]][[:digit:]]
crw-rw----. 1 root disk 21, 0 Oct 21 23:31 /dev/sg0
crw-rw----+ 1 root cdrom 21, 1 Oct 21 23:31 /dev/sg1
brw-rw----+ 1 root cdrom 11, 0 Oct 21 23:31 /dev/sr0
[root@linuxprobe ~]# ls -l /dev/s[[:alpha:]][[:digit:]]
crw-rw----. 1 root disk 21, 0 Oct 21 23:31 /dev/sg0
crw-rw----+ 1 root cdrom 21, 1 Oct 21 23:31 /dev/sg1
brw-rw----+ 1 root cdrom 11, 0 Oct 21 23:31 /dev/sr0
[root@linuxprobe ~]# ls -l /dev/s??[0-9]
brw-rw----. 1 root disk 8, 1 Oct 21 23:31 /dev/sda1
brw-rw----. 1 root disk 8, 2 Oct 21 23:31 /dev/sda2

[root@linuxprobe ~]# *ls .txt
aa.txt bb.txt cc.txt result.txt
[root@linuxprobe ~]# ls !(result).txt && rm -vf !(result).txt && ls
aa.txt bb.txt cc.txt
removed ‘aa.txt’
removed ‘bb.txt’
removed ‘cc.txt’

aa.tar.bz2 bb etc Pictures Videos
aa.tar.gz Desktop etc.tar.gz Public
aa.zip Documents initial-setup-ks.cfg result.txt
anaconda-ks.cfg Downloads Music Templates

(3.3)常用转义符

常用4个转义符及作用
反斜杠() :使反斜杠后面的变量变为单纯的字符
单引号 (‘ ’) :转义其中所有的变量为单纯的字符串
双引号(“ ”):保留其中的变量属性,不进行转义处理
反引号 (· ·):把其中的命令执行后返回结果(不关心过程,只取结果

$转义符 $定$0当前脚本的文件名

$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1 第二个参数是$2

$#传递给脚本或函数的参数个数

$*传递给脚本或函数的所有参数

$@传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同

$?上个命令的退出状态,或函数的返回值

$$当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID

一个小知识:shell脚本里的变量可以直接定义使用,不像其他语音需要先定义后使用

[root@linuxprobe ~]# PRICE=6
[root@linuxprobe ~]# echo “price is $PRICE”
price is 6
[root@linuxprobe ~]# echo “price is $$PRICE”
price is $6
[root@linuxprobe ~]# echo $$
3160
[root@linuxprobe ~]#
[root@linuxprobe ~]# echo uptime
02:57:25 up 18:11, 1 user, load average: 0.00, 0.01, 0.00

echo uname -a
Linux linuxprobe.com 4.18.0-80.el8.x86_64 #1 SMP Wed Mar 13 12:02:46 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

(3.5)重要的环境变量

定义:变量是计算机系统用于保存可变值的数据类型。在Linux系统中,变量名一般都是大写,命令则是小写,这是一种约定俗称规范。Linux系统中的环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的加目录、邮件存放位置等等。也可以直接通过变量名称来提取到对应的值。

Linux下一切皆文件,包括所输入的命令都有其存放的目录,执行一条命令,实际上系统是通过4个步骤运行的。

第1步:判断用户是否以绝对路径或相对路劲的方式输入命令(如/bin/lis),如果是绝对路径则直接执行,否则进入第2步继续判断

第2步:Linux系统检查用户输入的命令是否为“别名命令”,即用以个自定义的命令名来替换原本的命令名称。
例如删除命令“rm”,Linux系统都会要求用户确认是否执行操作命令,其实是Linux系统为了防止用户误删除特意设置的rm别名----”rm -i“。

alias 用来创建一个命令别名
格式: alias 别名=命令名称
取消格式:unalias 别名

第3步:Bash解释器判断用户输入的是内部命令还是外部命令。内部命令是解释器内部的指令,会被直接执行;我们大多数输入的是外部命令,外部命令会交给下面第4步处理。
查看命令是内外部命令用 ”type 命令名称”

[root@linuxprobe ~]# type ls
ls is aliased(被设置别名) to `ls --color=auto’
[root@linuxprobe ~]# type echo
echo is a shell builtin(内置)
[root@linuxprobe ~]# type uptime
uptime is /usr/bin/uptime(命令的路径)

第4步:系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫做 PATH ,简单的理解为Bash的小助手,作用是告诉Bash解释器执行命令可能存放的位置,Bash逐个查找。(此刻摸了摸头,碎了一地的头发~~~~)!PATH 是由多个路径组成的变量,每个路径之间用“ :”隔开,这些路径的增加和删除都会影响到Bash解释器对Linux命令的查找。

如果接受一台Linux服务器,一定会在执行命令前检查PATH环境变量是否有可疑的目录。平常我们也步会把当前路径(。)添加到PATH,查看Linux所有的环境变量 用 “env
env 回车

其中10个重要的系统环境变量
HOME 用户的主目录(家目录)
SHELL 用户在使用的Shell的解释器名称
HISTSIZE 输出的历史命令记录条数
HISTFILESIZE 保存历史命令记录条数 /etc/profile ~/.bashrc
MALL 邮件保存路径
LANG 系统语言语系
PANDOM 生成随机数字
PS1 Bash解释器的提示符 可以更该
PATH 定义解释器搜索用户执行命令的路径
EDITOR 用户默认的文本编辑器

Linux是一个多用户、多任务的操作系统,每个用户都有自己的独立的、合适的工作环境。

变量有固定的变量名与用户或系统设置的变量值两部分组成。
有些变量不能适应需求,可以用 export 来提升生全局变量,可以用unset 变量名随时取消。

临时设置的变量会在系统重启后消失,需要编辑俩个文件成为常用变量,可以一直使用。

/.bashrc
/.bash_profile

第三章 完 其实有肯了三天。。。继续加油!

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值