6.29 8.6-8.9

8.6 管道符和作业控制

管道符:将一个命令输出的内容传递给后面的命令

grep:过滤指定内容

[root@hyc-01-01 ~]# wc -l 1.txt

2 1.txt 统计文件行数

[root@hyc-01-01 etc]# ls |wc –l

177 统计一个目录中的文件及子目录的数量

[root@hyc-01-01 ~]# find ./ -type f

./.bash_logout

./.bash_profile

./.bashrc

./.cshrc

./.tcshrc

./anaconda-ks.cfg

./.bash_history

./.ssh/authorized_keys

./CentOS7-Base-163.repo

./1.txt

./.viminfo

[root@hyc-01-01 ~]# find ./ -type f|wc –l 列出当前目录下所有文件再统计行数

11 当前目录下共有11个文件

 

ctrl+z:临时暂停当前执行的命令

[root@hyc-01-01 ~]# vim 1.txt

按下ctrl+z

[1]+  已停止               vim 1.txt

[root@hyc-01-01 ~]#

这样执行会将命令调到后台并暂停执行

[root@hyc-01-01 ~]# fg 重新将命令调入前台执行

vim 1.txt

[root@hyc-01-01 ~]# vim 2.txt

[2]+  已停止               vim 2.txt

[root@hyc-01-01 ~]# jobs 列出当前的任务

[1]-  已停止               vim 1.txt id号为1

[2]+  已停止               vim 2.txt id号为2

[root@hyc-01-01 ~]# fg 1 将后台id号为1的进程调入前台执行

vim 1.txt

[root@hyc-01-01 ~]# vmstat 1 可以自动、持续显示系统的一些状态,执行期间用户无法进行其他操作

[root@hyc-01-01 ~]# bg 2

[root@hyc-01-01 ~]# jobs

[1]+  已停止               vim 1.txt

[2]-  运行中               vmstat 1 &

此时vmstat 1被调入后台运行,虽然依旧不停显示,但此时用户可以执行操作

[root@hyc-01-01 ~]# sleep 1000 执行后所有进程暂停1000s1000s后恢复

[root@hyc-01-01 ~]# bg

[4]+ sleep 200 &

[root@hyc-01-01 ~]# jobs

[1]   已停止               vim 1.txt

[2]-  已停止               vmstat 1

[3]+  已停止               sleep 1000

[4]   运行中               sleep 200 &

[root@hyc-01-01 ~]# jobs

[1]   已停止               vim 1.txt

[2]-  已停止               vmstat 1

[3]+  已停止               sleep 1000

[root@hyc-01-01 ~]# fg

sleep 1000

bg不加进程id则会将最近一次已停止的进程调入后台运行

fg不加进程id会将最近一次调入后台或已停止的进程调到前台运行

[root@hyc-01-01 ~]# sleep 1000 & 在命令开始运行时直接调入后台

[3] 1430

[root@hyc-01-01 ~]# jobs

[1]-  已停止               vim 1.txt

[2]+  已停止               vmstat 1

[3]   运行中               sleep 1000 &

 

新开一个终端:

[root@hyc-01-01 ~]# jobs 一个终端无法发现另一个终端下的任务

[root@hyc-01-01 ~]# ps aux|grep sleep 查看sleep相关进程,可以发现由另一个终端发起的sleep进程

root      1430  0.0  0.0 107948   348 pts/0    S    12:47   0:00 sleep 1000

root      1454  0.0  0.0 112720   984 pts/1    S+   12:53   0:00 grep --color=auto sleep

Jobs命令只能查看当前终端下的任务

 

8.7 shell变量

[root@hyc-01-01 ~]# env 获取系统变量

XDG_SESSION_ID=2 变量名=变量值

HOSTNAME=hyc-01-01

SELINUX_ROLE_REQUESTED=

TERM=xterm

SHELL=/bin/bash

HISTSIZE=1000

SSH_CLIENT=192.168.31.1 49826 22

SELINUX_USE_CURRENT_RANGE=

此处系统变量名为大写,变量的值可以是数字或一串字符串等

[root@hyc-01-01 ~]# set 显示变量信息(包括系统环境变量和用户自定义变量)

BASH=/bin/bash

BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath

BASH_ALIASES=()

BASH_ARGC=()

BASH_ARGV=()

BASH_CMDS=()

BASH_LINENO=()

BASH_SOURCE=()

BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")

BASH_VERSION='4.2.46(2)-release'

 

自定义变量

[root@hyc-01-01 ~]# a=111

[root@hyc-01-01 ~]# echo $a

111

[root@hyc-01-01 ~]# set |grep 111

_=111

a=111

 

变量名规则:

必须是字母、数字、下划线;

首位不能是数字;

[root@hyc-01-01 ~]# 3a=r 变量名首位不得为数字

-bash: 3a=r: 未找到命令

[root@hyc-01-01 ~]# a=a b c

-bash: b: 未找到命令

[root@hyc-01-01 ~]# a='a b c'

变量内容包含空格、特殊符号时需要用单引号括起来;

单引号可以脱义;

[root@hyc-01-01 ~]# a="a$bc" 双引号无法将特殊字符脱义

[root@hyc-01-01 ~]# echo $a

a

[root@hyc-01-01 ~]# a='a$bc'

[root@hyc-01-01 ~]# echo $a

a$bc

 

变量累加

[root@hyc-01-01 ~]# a='a$bc' 单引号将$符号脱义,$显示为纯符号

[root@hyc-01-01 ~]# echo $a

a$bc

[root@hyc-01-01 ~]# b=233

[root@hyc-01-01 ~]# echo $a$b

a$bc233

[root@hyc-01-01 ~]# c="a$b"c 双引号会将引号内和引号外的内容分隔,但不会脱义

[root@hyc-01-01 ~]# echo $c

a233c

[root@hyc-01-01 ~]# c='a$b'c $被脱义

[root@hyc-01-01 ~]# echo $c

a$bc

[root@hyc-01-01 ~]# c="$a""$b"c 多个变量累加时可以用双引号将多个变量引起来

[root@hyc-01-01 ~]# echo $c

a$bc233c

[root@hyc-01-01 ~]# echo $a

a$bc

[root@hyc-01-01 ~]# echo $b

233

8.8 shell变量

[root@hyc-01-01 ~]# w

 19:20:41 up  1:30,  2 users,  load average: 0.00, 0.01, 0.05

USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT

root     tty1                      17:51    1:28m  0.03s  0.03s -bash

root     pts/0    192.168.31.1     17:52    1.00s  0.14s  0.04s w

当前有两个用户登录系统,登录的用户均为root

登录的终端分别为tty1pts/0

其中一个登录的ip192.168.31.1

[root@hyc-01-01 ~]# echo $SSH_TTY 查看当前登录的终端

/dev/pts/0 当前登录的是pts/0

 

[root@hyc-01-01 ~]# echo $SSH_TTY 用户自定义变量仅在本身终端下有效

/dev/pts/0

[root@hyc-01-01 ~]# hyc=233

[root@hyc-01-01 ~]# echo $hyc

233

[root@hyc-01-01 ~]# echo $SSH_TTY

/dev/pts/1

[root@hyc-01-01 ~]# echo $hyc

 

进入子shell

[root@hyc-01-01 ~]# bash 进入子shell

[root@hyc-01-01 ~]# echo $hyc

233

[root@hyc-01-01 ~]# bash

[root@hyc-01-01 ~]# echo $hyc 上一级shell中的自定义变量在子shell中无效

[root@hyc-01-01 ~]#

[root@hyc-01-01 ~]# yum install -y psmisc 安装pstree命令相关的包

[root@hyc-01-01 ~]# pstree

systemd─┬─NetworkManager───2*[{NetworkManager}]

        ├─VGAuthService

        ├─auditd───{auditd}

        ├─chronyd

        ├─crond

        ├─dbus-daemon───{dbus-daemon}

        ├─dhclient

        ├─firewalld───{firewalld}

        ├─login───bash

        ├─master─┬─pickup

                └─qmgr

        ├─polkitd───5*[{polkitd}]

        ├─rsyslogd───2*[{rsyslogd}]

        ├─sshd─┬─sshd───bash───bash───pstree

              └─sshd───bash───bash

        ├─systemd-journal

        ├─systemd-logind

        ├─systemd-udevd

        ├─tuned───4*[{tuned}]

        └─vmtoolsd───{vmtoolsd}

sshd可以看出有两个用户通过ssh登录终端;

其中一个用户获得了子shell并在子shell下运行了pstree

 

定义全局变量

[root@hyc-01-01 ~]# export hyc=123 定义全局变量

[root@hyc-01-01 ~]# bash

[root@hyc-01-01 ~]# echo $hyc

123

shell的所有子shell都拥有全局变量hyc

但其他终端下不拥有该变量;

[root@hyc-01-01 ~]# pstree

        ├─polkitd───5*[{polkitd}]

        ├─rsyslogd───2*[{rsyslogd}]

        ├─sshd─┬─sshd───bash───bash───pstree 在该sshd下定义的全局变量hyc在另一个sshd(另一个终端)下不会生效

              └─sshd───bash───bash

[root@hyc-01-01 ~]# bash

[root@hyc-01-01 ~]# tt=re

[root@hyc-01-01 ~]# echo $tt

re

[root@hyc-01-01 ~]# exit

exit

[root@hyc-01-01 ~]# echo $tt

定义的全局变量向下生效(该bash下定义的全局变量对该bash的子bash生效,对父bash不生效)

 

取消变量

[root@hyc-01-01 ~]# echo $hyc

123

[root@hyc-01-01 ~]# unset hyc 取消变量

[root@hyc-01-01 ~]# echo $hyc

[root@hyc-01-01 ~]#

以上全局变量仅在当前终端或当前终端的子shell下生效,重开终端无效;

局部变量仅在当前终端的当前shell下有效,子shell或另开终端无效;

8.9 环境变量配置文件

系统层次

blob.png

用户层次

用户家目录下

blob.png

/etc/profile文件会在用户登录时自动加载里面的配置

/etc/bashrc文件在用户或系统执行shell脚本会加载,不是必须用户登录

 

/etc/profile下的环境变量全局生效,~/bash_profile下的环境变量仅对当前用户生效

[root@hyc-01-01 ~]# . .bash_profile 加载配置文件中的配置(.等同于source

[root@hyc-01-01 ~]# source .bash_profile

 

[root@hyc-01-01 ~]# cat .bash_profile

# .bash_profile

# Get the aliases and functions

if [ -f ~/.bashrc ]; then

         . ~/.bashrc .bash_profile会调用.bashrc

[root@hyc-01-01 ~]# cat .bashrc

# .bashrc

# User specific aliases and functions

alias rm='rm -i'

alias cp='cp -i'

alias mv='mv -i'

# Source global definitions

if [ -f /etc/bashrc ]; then

         . /etc/bashrc .bashrc又会自动调用/etc/bashrc

Fi

.bash_logout定义用户每次登出时执行的操作

若需要用户每次登出时删除历史命令,则可以将删除历史命令的命令写入该文件

变量PS1

[root@hyc-01-01 ~]

root登录的用户

hyc-01-01 主机名(hostname

~ 所在目录

[root@hyc-01-01 ~]# echo $PS1

[\u@\h \W]\$

[root@hyc-01-01 aa]# PS1='[\u@\h \w]\$'

[root@hyc-01-01 /tmp/aa]#

W改为w后开始显示绝对路径

[root@hyc-01-01 /tmp/aa]#PS1='<\u@\h \w>\$'

<root@hyc-01-01 /tmp/aa>#

修改[]<>

[root@hyc-01-01 aa]PS1='[\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$]'

[root@hyc-01-01:/tmp/aa#]

附带颜色显示

 

变量PS2在一些特殊的地方使用的变量(mysql界面下),作用等同于PS1

[root@hyc-01-01:/tmp/aa#]echo $PS2

[root@hyc-01-01:/tmp/aa#]for i in `seq 1 10`


猜你喜欢

转载自blog.51cto.com/12216458/2134827
8.9