管道符:将一个命令输出的内容传递给后面的命令
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 执行后所有进程暂停1000s,1000s后恢复
[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;
登录的终端分别为tty1和pts/0;
其中一个登录的ip为192.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 环境变量配置文件
系统层次
用户层次
用户家目录下
/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`
>
原文:http://blog.51cto.com/12216458/2134827