1. 程式人生 > >6.29 8.6-8.9

6.29 8.6-8.9

network dhclient blob man 進入 變量 統計文件 作用 字符串

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 環境變量配置文件

系統層次

技術分享圖片

用戶層次

用戶家目錄下

技術分享圖片

/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