8.6 管道符和作业控制
8.7/8.8 shell变量
8.9 环境变量配置文件
 



8.6 管道符和作业控制


管道符| 

将前一个指令的输出作为后一个指令的输入。

#cat 1.txt |wc -l 
[root@centos7 ~]# cat 1.txt |wc -l 统计行数
2
[root@centos7 ~]# ls 
1.txt  1.xtx  2.txt  3.txt  4.txt  a_(2).txt  AA.txt  anaconda-ks.cfg  anaconda-ks.cfg.1  a.txt  A.txt  bb.txt  err  temp.1
[root@centos7 ~]# ls |wc -l 统计文件数量
14
#cat 1.txt |grep 'aaa'
在1.txt中过滤'aaa',并显示出相关'aaa'的信息。

ctrl z暂停一个任务

假如,在使用#vim 1.txt写入信息时,想退出当前vim窗口去做其他操作又不想影响数据录入,又不想wq退出。这时候可以使用ctrl z去把任务暂停。

[root@centos7 ~]# vim 1.txt 
[1]+  已停止               vim 1.txt
[root@centos7 ~]# cat 1.txt 
1.txt
2.txt


jobs查看后台的任务

# jobs
[1]-  已停止               vim 1.txt
[2]+  已停止               vim a.txt

fg[id]把任务调到前台

#fg 
可以把被暂停的任务调出来,如果多个被暂停,需要加入ID号即可调出。例如暂停了2个任务,把第二个任务调出来,如下操作:
#fg2
# fg 2
vim a.txt
[2]+  已停止               vim a.txt

bg[id]把任务调到后台

退出fg2先

#fg2 进入第二个vim,q或者wq退出。
[root@centos7 ~]# jobs 
[1]+  已停止               vim 1.txt

用vmstat 1来测试,#vmstat1命令:不停自动显示系统状态

#vmstat1


ctrl z停止,使用#bg调到前台

#jobs


期间可以敲命令 可以正常使用,只是影响显示。

现在要把vmsta1调到前台,

首先把fg1退出

#fg 进去把之前的vim暂停任务退出,q!
#jobs vmstat1
#fg把vmstat 1调到前台

#jobs运行中

ctrl c退出

#jobs无任务。


示例2

#sleep 1000暂停1000秒
^Z
[1]+  已停止               sleep 1000
#jobs 已停止状态
# jobs
[1]+  已停止               sleep 1000
#sleep 200
#jobs两个停止状态
#fgfg不加ID号,会自动识别成:fg 最后一次暂停
ctrl z 暂停
# bg 1放到后台。
[1]- sleep 1000 &
#jobs
# jobs
[1]-  运行中               sleep 1000 &
[2]+  已停止               sleep 200
退出两个sleep命令
#fg1 + ctrl c 
#fg2 + ctrl c

命令后面加&直接丢到后台

#sleep 100 &


8.7shell变量(上)


变量

例如环境变量PATH,它是shell预设的一个变量。

shell预设的变量都是大写的。

变量就是使用一个简单的字符串来替代某些具有特殊意义的设定以及数据。

就拿PATH来讲,这个PATH就代替了所有常用命令的绝对路径的设定。

有了PATH这个变量,我们运行某个命令时,就不再需要输入全局路径,直接输入命令名即可。


env命令

  • HOSTNAME主机名

  • SHELL表示当前用户的shell类型

  • HISTSIZE你是记录数

  • MAIL当前用户的邮件存放目录

  • PATH该变量决定了shell将到哪些母驴寻找命令程序。

  • LANG语言

  • HOME 家目录

  • LOGNAME当前用户登录名

  • PWD当前目录


set命令多了很多变量,并且包括用户自定义的变量

自定义变量a=1

[root@centos7 ~]# a=111 
[root@centos7 ~]# echo $a
111

在set里可以过滤出刚刚设了值为a=111

# set |grep 111
a=111

或者

#set |less

在set下面/搜索a=111

/a=111

#env下面没有a=111值,因为不会被保存到env里


变量名规则:字母、数字下划线,首位不能为数字

a2=111

_a2=111这两个都可以

2a=111这个不行


变量值有特殊符号时需要用单引号括起来(“”双引号也可以,不过建议用‘’因为可以脱意)

[root@centos7 ~]# a='a b c'
[root@centos7 ~]# echo $a
a b c

下例演示值为a=a$bc 没脱意与脱意的效果

[root@centos7 ~]#  a="a$bc"
[root@centos7 ~]# echo $a

a使用"",不能脱意

[root@centos7 ~]# a='a$bc'
[root@centos7 ~]# echo $a

a$bc使用'',脱意


变量的累加

演示$代表累加,连着显示。

[root@centos7 ~]# a=1
[root@centos7 ~]# b=2
[root@centos7 ~]# echo $a$b
12
[root@centos7 ~]# c="a$bc"
[root@centos7 ~]# echo $c
a
[root@centos7 ~]# c="a$b"c 
[root@centos7 ~]# echo $c
a2c
[root@centos7 ~]# c=a"$b"c c="a$b"c与 c=a"$b"c 是两个一样的效果。命令c="a$b"c的第一个"会被移动a后面,演变成了c=a"$b"c,所以两者效果一样。
[root@centos7 ~]# echo $c
a2c


全局变量export b=2



unset变量



8.8 shell变量(下)


全局变量export b=2

先打开2个终端(0号和1号)

查看当前窗口位于哪个tty下

先w查看登录信息

[root@centos7 ~]# w
 17:40:31 up  7:46,  3 users,  load average: 0.02, 0.02, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1                      09:56    7:43m  0.08s  0.08s -bash
root     pts/0    192.168.189.1    09:57    7.00s  0.44s  0.00s w
root     pts/2    192.168.189.1    17:38    2:11   0.01s  0.01s -bash

利用$SSH_TTY 查看当前tty

0号查看

echo $SSH_TTY 
/dev/pts/0

1号查看

# echo $SSH_TTY 
/dev/pts/2

在0号建立变量aming=linux

[root@centos7 ~]# aming=linux
[root@centos7 ~]# echo $aming 
linux

在1号使用变量aming=linux

[root@centos7 ~]# echo $aming

在0号使用#bash进入一个子shell,然后#pstree查看当前bash位置

#bash(shell其实就等于一个进程,如果#bash,等于进入一个新的bash)
#pstree

详解此段ssh-bash-bash-pstree

首先通过ssh获得了一个bash(第一个bash,主shell),然后#bash(第二个bash,子shell),再在第二个bash执行了pstree命令


0号和1号都是无变量值

[root@centos7 ~]# echo $aming

无变量值


#exit退出刚刚建立的#bash(子shell),返回第一个bash,主shell。#echo有变量值

[root@centos7 ~]# exit
exit
[root@centos7 ~]# echo $aming 
linux

这种变量叫非全局、本地local变量,仅仅在当前终端(sshd)生效。


全局变量 export aming=linux 

在使用全局变量后,新加shell也是可以使用该变量,仅仅在当前终端(sshd)生效。。

[root@centos7 ~]# export aming=linux
[root@centos7 ~]# echo $aming 
linux
[root@centos7 ~]# bash
进入一个新shell
[root@centos7 ~]# echo $aming
linux成功


演示2

[root@centos7 ~]# export b=2
[root@centos7 ~]# echo $b
2
[root@centos7 ~]# exit
exit
[root@centos7 ~]# echo $aming 
linux
[root@centos7 ~]# echo $b
空


为什么这里是空,原因很简单。是因为shell生成原理是基础shell向下生成子shell,孙shell,以此类推。而exit是退出shell,属于向上,往上动作,所以此时全局变量是不会生效的。所以为什么exit退出shell时,echo $aming生效 而echo $b不生效,是因为echo $aming处于的shell比echo $b还要往上,而shell是往下生成,所以echo $b不生效。


unset变量

# unset $aming
# unset $b

取消 $b的变量



8.9 环境变量配置文件


两大围度


系统层次 

/etc/profile

用户环境变量,交互,登录才执行

这个文件预设了几个重要的变量。例如PATH、USER、LOGNAME、MAIL、INPUTRC、HOSTNAME、HISTSIZE、umask等。


高亮用户层次

/etc/bashrc

用户不用登录,执行shell就生效

这个文件主要预设umask以及PS1。这个PS1就是我们在输入命令时前面的那串字符[root@centos7 ~]# 。

[root@centos7 ~]# echo $PS1

   查看PS1的变量

[\u@\h \W]\$ 对应是\u=user @h=hostnae \W=目录的最后一层。 

可以更改PS1的值,把W改成w,效果是显示绝对路径

#PS1='[\u@\h \w]\$ '

注意,有特殊符号需要加''来脱意

#echo PS1 
[\u@\h \w]\$

可以更改改颜色参数 

PS1='\[\033[01;32m\]\u@\h\[033[00m\]:\[033[01;36\]\w\[\033[00m\]\$ '
~/.bashrc

该文件包含专属于自己的shell的bash信息,当登录或每次打开新的shell时,该文件会被读取。例如,可以将用户自定义的别名或者自定义变量写到这个文件中。  


~/.bash_profile

.跟#source是一样的效果,例如

#. .bash_profile = #source .bash_profile

定义用户的个人化路径与环境变量的文件名称。每个用户都可以使用该文件输入属于自己的shell信息,当用户登录时,该文件仅仅执行一次。


~/.bash_history

用于记录命令历史。


~/.bash_logout

退出shell时,用户退出时将要做的操作。。