6.29 8.6-8.9
管道符:將一個命令輸出的內容傳遞給後面的命令
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被調入後臺運行,雖然依舊不停顯示,但此時用戶可以執行操作
[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`
>
6.29 8.6-8.9