Shell
shell是一個指令解釋器,提供使用者和機器之間的互動
支援特定文法,比如邏輯判斷、循環
每個使用者都可以有自己特定的shell
CentOS7預設shell為bash(Bourne Agin Shell)
還有zsh、ksh等
指令曆史
history 最多可以存一千條,如果不正常退出(exit,logout)指令曆史儲存的就不會完整的儲存
檔案路徑:ls /root/.bash_history#cat /root/.bash_history
由echo $HISTSIZE 環境變量配置規定

如何修改這個數值編輯它的配置檔案,vi /etc/profile,/搜到HISTSIZ它可以修改,必須退出終端或者輸入指令source /etc/profile才會生效
history -c #可以把目前記憶體裡的指令曆史的緩存清空,但并不會删除存指令的配置檔案
history 僅僅是顯示的指令的ld,如何記錄一條指令它是什麼時間運作的,可以運作這條指令:HISTTIM EFORMAT= "%Y/%m/%d %H:%M:%S " 但隻是在目前終端生效
永久生效需要編輯配置檔案:vim /etc/profile
/搜尋一下HISTSIZE
把指令HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "放到那,如下圖
source /etc/profile#生效
chattr +a ~/.bash_history #永久儲存指令曆史,不讓别人删除
!! #兩個歎号意思是上一條指令,指令曆史最後一條指令
!n #運作指定的指令,n表示數字,假如說我想運作第936條指令
936 ls
937 yum history
938 history
939 echo $HISTSIZ
940 echo $HISTSIZE
941 logout
942 exit
943 history
[root@aaa-01 ~]# !936
ls
111 1_heard.txt 1.txt.xz 2.txt 2.txt.xz 999 9.txt anaconda-ks.cfg a.txt
!echo #在指令曆史裡邊倒着找第一個以echo開頭的指令,正好是940條
940 echo $HISTSIZE
941 logout
942 exit
943 history
944 ls
945 echo $HISTSIZE
946 history
[root@aaa-01 ~]# !echo
echo $HISTSIZE
1000
指令補全和别名
tab鍵,敲一下,敲兩下
指令、參數補全需要先安裝:yum install -y bash-completion
重新開機生效:reboot
alias别名給指令重新起個名字,例如你把重新開機網絡服務的指令定義成restartnet
取消别名:unalias 加定義的别名
alias在哪裡定義的?
第一個地方是使用者的家目錄下~/.bashrc檔案
第二個是: ls /etc/profile.d/
自定義的alias放到~/.bashrc
reboot重新開機一下
alias别名給指令重新起個名字
通配符
· Is *.txt 以.txt結尾的檔案
[root@aaa-01 ~]# ls *.txt
1_heard.txt 2.txt 9.txt a.txt
[root@aaa-01 ~]# ls *txt
1_heard.txt 2.txt 9.txt a.txt
[root@aaa-01 ~]# ls *txt*
1_heard.txt 1.txt.xz 2.txt 2.txt.xz 9.txt a.txt
[root@aaa-01 ~]# ls 1*
1_heard.txt 1.txt.xz
111:
yum.log
· Is ?.txt 一個任意的字元,bb就不行,
· Is [0-9].txt 0到9範圍内的,[23]就是2和3,2或者3,有一個3也行,有一個2也行,兩者有一個滿足就行
或者:ls [a-z].txt ls [A-Z].txt ls [0-9a-zA-Z].txt
[root@aaa-01 ~]# ls [a-z].txt
a.txt
[root@aaa-01 ~]# ls [A-Z].txt
ls: 無法通路[A-Z].txt: 沒有那個檔案或目錄
[root@aaa-01 ~]# ls [0-9a-zA-Z].txt
2.txt 9.txt a.txt
[root@aaa-01 ~]#
· Is {1,2}.txt 這個範圍當中的一個“或”的意思
[root@aaa-01 ~]# ls {2,a}.txt
2.txt a.txt
[root@aaa-01 ~]#
[root@aaa-01 ~]# ls {2,a,3,9}.txt
ls: 無法通路3.txt: 沒有那個檔案或目錄
2.txt 9.txt a.txt
輸出重定向
>解釋:重定向的意思,把前面這個檔案的輸出結果直接輸入到後邊這個檔案裡邊去,
· cat 1 .txt > 2.txt 把1.txt裡的内容重定向到2.txt裡邊去,>它會把檔案内容删除掉重寫
>>追加的意思,它不會把你原來的内容删除,例如cat 1.txt >> 2.txt ,把1.txt的内容追加到2.txt中
2>解釋:錯誤重定向它會把指令産生的錯誤資訊指定輸出到檔案裡去
例如輸入錯誤指令Isaaa,然後把它的結果輸入到a.txt
[root@aaa-01 ~]# lsaaa 2> a.txt
[root@aaa-01 ~]# cat a.txt
-bash: lsaaa: 未找到指令
[root@aaa-01 ~]#
2>>錯誤追加重定向
[root@aaa-01 ~]# lsaaa 2>> a.txt
[root@aaa-01 ~]# cat a.txt
-bash: lsaaa: 未找到指令
-bash: lsaaa: 未找到指令
[root@aaa-01 ~]#
正确和錯誤也可以一起使用
&>正确的和錯誤的結合
輸入重定向
<解釋:輸入重定向,把右邊的一個檔案或者檔案的内容輸入到左邊的一個指令裡邊去,左邊隻能是指令不能是檔案
例如:wc -l < a.txt,意思是檢視a.txt的行數 ,或者檢視a.txt的大小du -sh < a.txt
管道符
管道符:把一個檔案的輸出的内容傳遞給後邊的指令
例如:檢視1.txt有多少行cat 1.txt |wc -l ; cat 1.txt |grep 'aaa' 首先把1.txt的内容輸出出來,再交給後邊的指令。grep過濾指定關鍵詞的指令,隻要含有aaa的都過濾出來
[root@aaa-01 ~]# cat 1.txt |wc -l
5
[root@aaa-01 ~]# cat 1.txt |grep 'aaa'
aaa
作業控制
ctrl+z #暫停一個任務 fg #調回來 假如說你在編輯1.txt檔案突然想檢視一下目前目錄下的東西
[root@aaa-01 ~]# vim 1.txt
[1]+ 已停止 vim 1.txt
[root@aaa-01 ~]# ls
111 1.txt 2.txt 999 anaconda-ks.cfg
1_heard.txt 1.txt.xz 2.txt.xz 9.txt a.txt
[root@aaa-01 ~]# fg
ctrl+z #支援停止多個任務
jobs檢視背景的任務
[root@aaa-01 ~]# jobs
[1]- 已停止 vim 1.txt
[2]+ 已停止 vim a.txt
bg[id]把任務調到背景,并且運作,直接bg執行的是最後的任務
如果他是動态的任務,他的輸出還會在螢幕上顯示,但是你可以輸指令
fg[id]把任務調到前台
[root@aaa-01 ~]# jobs
[1] 運作中 sleep 200 &
[2]- 已停止 sleep 100
[3]+ 已停止 sleep 300
[root@aaa-01 ~]# fg 3
sleep 300
sleep 100 停止100秒什麼都不幹
指令後面加&直接丢到背景運作
變量
PATH,HOME,PWD,LOGNAME
env指令可以擷取到系統的常用變量,=等号左邊是變量的名字(變量名=變量),系統的變量通常都是大寫的字母,變量的值就不一定了,可能是字母可能是字元串,可能是數字
[root@aaa-01 ~]# env
XDG_SESSION_ID=1
HOSTNAME=aaa-01
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.232.1 55022 22
SELINUX_USE_CURRENT_RANGE=
SSH_TTY=/dev/pts/0
USER=root
set指令也可以檢視變量,不僅檢視系統變量還可以檢視使用者自定義的變量,
自定義變量例如a=111,但他不是系統變量隻是使用者自定義的變量,隻能在set檢視的變量裡找到在env裡找不到
[root@aaa-01 ~]# a=111
[root@aaa-01 ~]# echo $a
111
變量名規則:字母、數字下劃線,首位不能為數字
[root@aaa-01 ~]# a1=2
[root@aaa-01 ~]# a_1=3
[root@aaa-01 ~]# _a1=4
[root@aaa-01 ~]# echo $a1
2
[root@aaa-01 ~]# echo $a_1
3
[root@aaa-01 ~]# echo $_a1
4
#首位是數字就會報錯
[root@aaa-01 ~]# 1aa=2
-bash: 1aa=2: 未找到指令
[root@aaa-01 ~]# 2aa=3
-bash: 2aa=3: 未找到指令
變量值有特殊符号時需要用單引号括起來
[root@aaa-01 ~]# a=a b c
-bash: b: 未找到指令
[root@aaa-01 ~]# a='a b c'
[root@aaa-01 ~]# echo $a
a b c
變量的累加用$
[root@aaa-01 ~]# a='a$bc'
[root@aaa-01 ~]# b='1$23'
[root@aaa-01 ~]# echo $a$b
a$bc1$23
自定義成多個變量組成的變量時用“”雙引号,單引号識别不出來
[root@aaa-01 ~]# a=123
[root@aaa-01 ~]# b=bc
[root@aaa-01 ~]# c='$a$b'
[root@aaa-01 ~]# echo $c
$a$b
[root@aaa-01 ~]# c="$a$b"
[root@aaa-01 ~]# echo $c
123bc
或者把變量單獨引起來“”
[root@aaa-01 ~]# b=bc
[root@aaa-01 ~]# c=a"$b"c
[root@aaa-01 ~]# echo $c
abcc
還可以這麼寫,根據上邊定義好的ab變量,在單獨想加個c
[root@aaa-01 ~]# c="$a$b"c
[root@aaa-01 ~]# echo $c
a$bc1$23c
自定義的變量隻能在目前終端生效,新打開的不會生效
全局變量
sshd——sshd——bash——pstree #我們遠端登入sshd通過與sshd獲得了一個bash,然後我們又在這個終端下運作了一個bash
當我們在登入一個子shell的時候發現他不能獲得自定義變量的值了,這叫做非全局變量或者叫做本地變量僅僅在你終端下生效
如何把它設定成全局變量用指令:export b=2,這樣不管你在子目錄下還是子子目錄下都會生效
但是新打開一個終端還是不會生效因為他們的sshd為并列關系
它所謂的全局變量指的是向下的,在你這個shell的基礎上去生成子shell子子shell的時候定義的全局變量才會生效
但是你在子shell中定義了一個全局變量,然後往上退一級到shell下來時就不生效了,全局變量是不會向上全局的
unset #取消自定義變量,後邊跟變量名
環境變量配置檔案
/etc/profile 使用者環境變量,互動,登入才執行
/etc/bashrc 使用者不用登入,執行shell就生效
~/.bashrc
~/.bash_profile
~/.bash_history
~/.bash_logout
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$ '
特殊符号
* 通配符,任意個任意字元例如: *.txt a.*
? 任意一個字元 ?.txt1也行a也行 隻要是一個字元就行
# 注釋字元,不生效
\ 脫義字元
| 管道符
幾個和管道符有關的指令
cut 分割,-d 分隔符 -f 指定段号 -c 指定第幾個字元
root@aaa-01:~# cat /etc/passwd |head -2
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
root@aaa-01:~# cat /etc/passwd |head -2 |cut -d ":" -f 1
root
bin
root@aaa-01:~# cat /etc/passwd |head -2 |cut -d ":" -f 1,2
root:x
bin:x
root@aaa-01:~# cat /etc/passwd |head -2 |cut -d ":" -f 1-3
root:x:0
bin:x:1
root@aaa-01:~# cat /etc/passwd |head -2 |cut -c 1
r
b
root@aaa-01:~# cat /etc/passwd |head -2 |cut -c 2
o
i
sort 排序, 預設按照ASCII排序
-n 以數字排序如果有字母她會認為是0
-r反序最大的在前邊最小的在後邊 -t 分隔符 -kn1/-kn1,n2
root@aaa-01:~# sort -n 1.txt
>
}
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
#$saasd
sync:x:5:0:sync:/sbin:/bin/sync
2233
111222
121333
root@aaa-01:~# sort -nr 1.txt
121333
111222
2233
sync:x:5:0:sync:/sbin:/bin/sync
#$saasd
root:x:0:0:root:/root:/bin/bash
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
}
>
wc
wc -l 統計行數
wc -m 統計字元數,會統計隐藏的換行符$
wc -w 統計詞,以空白字元作為分隔符
本來我們寫了6個字元123abc,我們在wc -m 的時候其實他會算上換行符$,cat -A檢視檔案所有的東西包括隐藏的
uniq 去重,它需要先先排序才會去重複,跟sort結合使用,-c統計行數
root@aaa-01:~# sort 2.txt
1
1
123
2
abc
root@aaa-01:~# sort 2.txt |uniq
1
123
2
abc
root@aaa-01:~# sort 2.txt |uniq -c
2 1
1 123
1 2
1 abc
tee 和>重定向類似,但它重定向的同時還在螢幕顯示加一個管道符 |
root@aaa-01:~# cat 2.txt |tee 1.txt
123
abc
1
2
1
root@aaa-01:~# cat 1.txt
123
abc
1
2
1
-a追加
root@aaa-01:~# cat 2.txt |tee -a 1.txt
123
abc
1
2
1
root@aaa-01:~# cat 1.txt
123
abc
1
2
1
123
abc
1
2
1
tr 替換字元,tr 'a' 'b',大小寫替換tr '[a-z]' '[A-Z]'
split 切割,-b大小(預設機關位元組),-l行數
$ 變量字首,!$組合,正則裡面表示行尾
;多條指令寫到一行,用分号分割
[root@aaa-01 ~]# ls -l 1.txt; wc -l 2.txt
-rw-r--r--. 1 root root 28 5月 30 11:14 1.txt
5 2.txt
~ 使用者家目錄,後面正規表達式表示比對符
& 放到指令後面,會把指令丢到背景
> >> 2> 2>> &>
[ ] 指定字元中的一個,[0-9],[a-zA-Z],[abc]
|| 和 && ,用于指令之間
||隻有在前邊的指令執行不成功的時候才會執行後邊的指令
[ -d aminglinux ]表示判斷是一個目錄是否存在,如果不存在就建立aminglinux目錄
&&隻有在第一條指令對的成功的時候才會執行第二條指令