天天看點

shell基礎知識

Shell

shell是一個指令解釋器,提供使用者和機器之間的互動

支援特定文法,比如邏輯判斷、循環

每個使用者都可以有自己特定的shell

CentOS7預設shell為bash(Bourne Agin Shell)

還有zsh、ksh等

指令曆史

history 最多可以存一千條,如果不正常退出(exit,logout)指令曆史儲存的就不會完整的儲存

檔案路徑:ls /root/.bash_history#cat /root/.bash_history

由echo $HISTSIZE  環境變量配置規定

shell基礎知識

如何修改這個數值編輯它的配置檔案,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 "放到那,如下圖

shell基礎知識

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

shell基礎知識
shell基礎知識

取消别名:unalias 加定義的别名

shell基礎知識

alias在哪裡定義的?

第一個地方是使用者的家目錄下~/.bashrc檔案

第二個是: ls /etc/profile.d/

shell基礎知識
shell基礎知識

自定義的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      
shell基礎知識

· Is ?.txt 一個任意的字元,bb就不行,

shell基礎知識

· Is [0-9].txt 0到9範圍内的,[23]就是2和3,2或者3,有一個3也行,有一個2也行,兩者有一個滿足就行

shell基礎知識

或者: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  這個範圍當中的一個“或”的意思

shell基礎知識
[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裡邊去,>它會把檔案内容删除掉重寫

shell基礎知識

>>追加的意思,它不會把你原來的内容删除,例如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 ~]#      

正确和錯誤也可以一起使用

shell基礎知識

&>正确的和錯誤的結合

shell基礎知識

輸入重定向

<解釋:輸入重定向,把右邊的一個檔案或者檔案的内容輸入到左邊的一個指令裡邊去,左邊隻能是指令不能是檔案

例如:wc -l < a.txt,意思是檢視a.txt的行數 ,或者檢視a.txt的大小du -sh < a.txt

shell基礎知識

管道符

管道符:把一個檔案的輸出的内容傳遞給後邊的指令

例如:檢視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  #支援停止多個任務

shell基礎知識

jobs檢視背景的任務

[root@aaa-01 ~]# jobs
[1]-  已停止               vim 1.txt
[2]+  已停止               vim a.txt      

bg[id]把任務調到背景,并且運作,直接bg執行的是最後的任務

shell基礎知識

如果他是動态的任務,他的輸出還會在螢幕上顯示,但是你可以輸指令

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秒什麼都不幹 

shell基礎知識

指令後面加&直接丢到背景運作

shell基礎知識

變量

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      

自定義的變量隻能在目前終端生效,新打開的不會生效

shell基礎知識

全局變量

sshd——sshd——bash——pstree #我們遠端登入sshd通過與sshd獲得了一個bash,然後我們又在這個終端下運作了一個bash

shell基礎知識

當我們在登入一個子shell的時候發現他不能獲得自定義變量的值了,這叫做非全局變量或者叫做本地變量僅僅在你終端下生效

shell基礎知識

如何把它設定成全局變量用指令:export b=2,這樣不管你在子目錄下還是子子目錄下都會生效

shell基礎知識

但是新打開一個終端還是不會生效因為他們的sshd為并列關系

shell基礎知識

它所謂的全局變量指的是向下的,在你這個shell的基礎上去生成子shell子子shell的時候定義的全局變量才會生效

但是你在子shell中定義了一個全局變量,然後往上退一級到shell下來時就不生效了,全局變量是不會向上全局的

shell基礎知識

unset  #取消自定義變量,後邊跟變量名

shell基礎知識

環境變量配置檔案

/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排序

shell基礎知識

-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 統計詞,以空白字元作為分隔符

shell基礎知識

本來我們寫了6個字元123abc,我們在wc -m 的時候其實他會算上換行符$,cat -A檢視檔案所有的東西包括隐藏的

shell基礎知識

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]'

shell基礎知識
shell基礎知識

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]

 || 和 && ,用于指令之間

||隻有在前邊的指令執行不成功的時候才會執行後邊的指令

shell基礎知識

[ -d aminglinux ]表示判斷是一個目錄是否存在,如果不存在就建立aminglinux目錄

shell基礎知識

&&隻有在第一條指令對的成功的時候才會執行第二條指令