1. 程式人生 > >五周第四次課(3月8日)

五周第四次課(3月8日)

Linux shell基礎知識

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!

#jobsvmstat1

#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時,用戶退出時將要做的操作。。




五周第四次課(3月8日)