shell基礎知識

Shelllinux


shell是一個命令解釋器,提供用戶和機器之間的交互正則表達式

支持特定語法,好比邏輯判斷、循環shell

每一個用戶均可以有本身特定的shellvim

CentOS7默認shell爲bash(Bourne Agin Shell)緩存

還有zsh、ksh等bash


命令歷史
網絡

history 最多能夠存一千條,若是不正常退出(exit,logout)命令歷史保存的就不會完整的保存ssh

文件路徑:ls /root/.bash_history#cat /root/.bash_historyide

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

image.png

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

wKioL1lYrz-gtA_xAADGkaLTLow221.png

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

image.png

image.png


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

image.png


alias在哪裏定義的?

第一個地方是用戶的家目錄下~/.bashrc文件

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

image.png

image.png 


自定義的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

wKioL1lYw-awB_wtAAFPDis1OIs301.png


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

wKioL1lYxDuhzWZ9AADIaVN9fR8384.png


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

wKiom1lYxEiR_JD_AAF6EGV8y_A346.png

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

wKiom1lYxFnyyAt0AACG6TFN8W4330.png

[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裏邊去,>它會把文件內容刪除掉重寫

wKiom1lYzvvRIUmaAADEGCh8EnI506.png

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


正確和錯誤也能夠一塊兒使用

image.png

&>正確的和錯誤的結合

image.png


輸入重定向

<解釋:輸入重定向,把右邊的一個文件或者文件的內容輸入到左邊的一個命令裏邊去,左邊只能是命令不能是文件

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

image.png


管道符

管道符:把一個文件的輸出的內容傳遞給後邊的命令

例如:查看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  #支持中止多個任務

image.png


jobs查看後臺的任務

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


bg[id]把任務調到後臺,而且運行,直接bg執行的是最後的任務

image.png 

若是他是動態的任務,他的輸出還會在屏幕上顯示,可是你能夠輸命令


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

image.png


命令後面加&直接丟到後臺運行

image.png


變量

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


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

{CC12IGW@XK)V44[DBVH]UR.png 


全局變量

sshd——sshd——bash——pstree #咱們遠程登陸sshd經過與sshd得到了一個bash,而後咱們又在這個終端下運行了一個bash

[P2WNXZ20E$_K3)}YP32XV5.png

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

2FRZJSNR34V}Z{{@$4NLH{6.png

如何把它設置成全局變量用命令:export b=2,這樣無論你在子目錄下仍是子子目錄下都會生效

image.png

可是新打開一個終端仍是不會生效由於他們的sshd爲並列關係

image.png


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

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

image.png

 

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

image.png


環境變量配置文件

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

image.png

-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 統計詞,以空白字符做爲分隔符

image.png

原本咱們寫了6個字符123abc,咱們在wc -m 的時候其實他會算上換行符$,cat -A查看文件全部的東西包括隱藏的

image.png


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

image.png 

image.png

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]


 || 和 && ,用於命令之間

||只有在前邊的命令執行不成功的時候纔會執行後邊的命令

image.png

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

image.png


&&只有在第一條命令對的成功的時候纔會執行第二條命令

image.png

由於aminglinux目錄已經存在了因此因此不會執行的二條命令

image.png

相關文章
相關標籤/搜索