1. 程式人生 > >shell變量,管道符,作業控制,shell變量,以及變量配置文件

shell變量,管道符,作業控制,shell變量,以及變量配置文件

shell

管道符
|:管道符是將前面的文件的輸出的內容傳遞給後面的命令
[root@localhost ~]# ls |wc -l
21
查看當前目錄下有多少文件
[root@localhost ~]# cat 1.txt |wc -l
1
查看1.txt的行數
以上的兩個例子就是管道符的簡單用法。

管道符常營命令

cut:截取字符串,比如我們要以“:”作為分隔符,取第一列,

[root@localhost ~]# cat /etc/passwd |head -5|cut -d ":" -f1

root

bin

daemon

adm

lp

這裏-d是指定分割符,-f後面接數字,是指截取範圍,上面的例子是截取第一段,就輸入-f1,如果想

截取兩段,就用“,”分開,後面再接一個數字。如f1,2。

如果是1-3段,後面就接1-3.

指定第幾個字符 -c

[root@localhost ~]# cat /etc/passwd |head -2|cut -c4

t

:

sort:排序,比如我們現在得到一列數字,或者是一列字符串,我們要由小到大做一個排序
[root@localhost ~]# sort /etc/passwd |head -1
adm:x:3:4:adm:/var/adm:/sbin/nologin
我們可以看到,sotr的排序是遵循英文字母的排序。這就是sort的作用。

sort -n會以數字大小去排序
[root@localhost ~]# sort -n 1.txt

<

{
}
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sync:x:5:0:sync:/sbin:/bin/sync
22223333
22222222222aaaaaaa
*我們需要註意的是,如果我們輸入-n,那麽文件裏面的特殊符號和字符會被認為是0。所以特殊符號和字母會排在前面。

sotr-r反向排序,與-n正好相反
[root@localhost ~]# sort -r 1.txt
sync:x:5:0:sync:/sbin:/bin/sync
1111111111133333333333
}

wc -l 統計行數
[root@localhost ~]# cat 1.txt | wc -l

20

wc -m 統計字符數
[root@localhost ~]# cat 1.txt | wc -m
499

wc -w 統計詞數,他是根據空格或者空白字符去分割的
[root@localhost ~]# cat 1.txt | wc -w
20

uniq去重復,他一般和sort在一起用,先排序,然後去重(最常用)
[root@localhost ~]# cat 2.txt
123
abc 1111,222
123
abc
1
1
2
然後我們排序,去重
[root@localhost ~]# sort 2.txt |uniq
1
123
2
abc
abc 1111,222

uniq -c統計重復次數
[root@localhost ~]# sort 2.txt |uniq -c
2 1
2 123
1 2
1 abc
1 abc 1111,222
tee:類似於>輸出重定向。>輸出重定向僅僅是將內容寫入到目標文件,對我們看不到任何的內容,成功與否。這時候我們就使用tee取代">"。它不僅可以將內容重定向到目標文件,也可以將內容打印到屏幕上。
[root@localhost ~]# sort 2.txt |uniq -c|tee a.txt
2 1
2 123
1 2
1 abc
1 abc 1111,222
這樣我們就可以看到輸出的內容了

tee -a追加,和>> 作用類似。但是在追加的同時將內容打印在屏幕上
[root@localhost ~]# sort 2.txt |uniq -c|tee -a a.txt
2 1
2 123
1 2
1 abc
1 abc 1111,222
[root@localhost ~]# cat a.txt
2 1
2 123
1 2
1 abc
1 abc 1111,222
2 1
2 123
1 2
1 abc

tr:替換字符,它支持寫多個字符
[root@localhost ~]# echo "aminglinux" |tr ‘[al]‘ ‘[AL]‘
AmingLinux
[root@localhost ~]# echo "aminglinux" |tr ‘a‘ ‘A‘
Aminglinux
全部替換成大寫
[root@localhost ~]# echo "aminglinux" |tr ‘[a-z]‘ ‘[A-Z]‘
AMINGLINUX

split:切割,將大文件切割成小文件。他有兩種用法,一種是 -b大小默認單位是字節 ,一種是 -l行數。(系統默認是以x開頭)
[root@localhost test]# split -b 1000 a.txt
[root@localhost test]# ls
a.txt xae xaj xao xat xay xbd xbi xbn xbs xbx xcc xch xcm xcr xcw xdb xdg xdl xdq xdv xea xef xek xep xeu xez xfe xfj
xaa xaf xak xap xau xaz xbe xbj xbo xbt xby xcd xci xcn xcs xcx xdc xdh xdm xdr xdw xeb xeg xel xeq xev xfa xff xfk
xab xag xal xaq xav xba xbf xbk xbp xbu xbz xce xcj xco xct xcy xdd xdi xdn xds xdx xec xeh xem xer xew xfb xfg xfl
xac xah xam xar xaw xbb xbg xbl xbq xbv xca xcf xck xcp xcu xcz xde xdj xdo xdt xdy xed xei xen xes xex xfc xfh xfm
xad xai xan xas xax xbc xbh xbm xbr xbw xcb xcg xcl xcq xcv xda xdf xdk xdp xdu xdz xee xej xeo xet xey xfd xfi
這就將a.txt按1000b切割完成了。

我們也可以切割完後給他命名,不用系統給我們的名字,但是我們只能自定義它的前綴。

s[root@localhost test]# split -b 100k a.txt abc

[root@localhost test]# ls
abcaa abcab a.txt xaa xab

split -l按行切割,比如我們都按照1000行切割
[root@localhost test]# split -l 1000 a.txt
[root@localhost test]# wc -l *
1000 xaa
1000 xab
1000 xac
這樣每個文件都是1000行。

後面接目標文件,就可以直接清空裏面的內容。
[root@localhost ~]# > a.txt
[root@localhost ~]# cat a.txt

註釋符
#:在#號後面輸入的shell都不回生效,它的作用是解釋說明。

$:變量前綴,!$組合,這則裏面表示行位

;多條命名寫到一行,用分號分割
[root@localhost ~]# ls 1.txt; wc -l 2.txt
1.txt
7 2.txt

~:用戶的家目錄,在正則表達式裏表示匹配符

&:命令放到後臺去

:輸出重定向,會把目標的內容全部替換
>:追加重定向,會將內容追加到目標內容的結尾處
2>:錯誤輸出重定向,和輸出重定向作用一樣
2>>:最佳錯誤重定向,和追加重定向作用一樣。
&>:直接把正確和錯誤直接輸入到目標文件中

【】:指定字符中的一個,經常用於替換,比如【0-9】,【a-zA-Z】,【abc】。

||:在shell代表或者,它用在兩條命令中間。如果第一條命令執行成功,它就不會執行第二條命令,如果執行不成功,它就會執行第二條命令。
[root@localhost ~]# ls 1a.txt|| wc -l 2.txt
ls: 無法訪問1a.txt: 沒有那個文件或目錄
7 2.txt
第一條命令沒有成功,它就執行了第二條
[root@localhost ~]# ls 1.txt|| wc -l 2.txt
1.txt
第一條命令成功了,它就不執行第二條。

&&:讓兩個命令連續執行,只有前面命令執行成功,後面命令才繼續執行。
[root@localhost ~]# ls 1.txt&& wc -l 2.txt
1.txt
7 2.txt
只有前一個命令執行成功,後一個才會執行
[root@localhost ~]# ls 1a.txt&& wc -l 2.txt
ls: 無法訪問1a.txt: 沒有那個文件或目錄
如果前一個命令不成功,那麽後一條命名就不會執行。

我們可以將||和&&理解成一個判斷,||只有前面的命令不成功的時候才執行後面的命令,&&只有前面命令成功的時候才會執行後面的命令。

作業控制
當我們在編輯一個文件,突然間我們要暫停一下去做其他事,這時我麽只要按Ctrl+z將現有的工作扔到後臺去,然後我們再做我們需要的事情
[root@localhost ~]# vim 1.txt
然後按Ctrl+z
[1]+ 已停止 vim 1.txt
這樣編輯1.txt的工作就放到後臺了。
如果我們還要繼續編輯1.txt,就輸入fg,這樣就把放在後臺的任務重新放回前面了

如果我們同時扔到後臺兩個命令,這時我們可以用jobs將後臺的任任務打印出來
[root@localhost ~]# jobs
[1]- 已停止 vim 1.txt
[2]+ 已停止 vim 2.txt
然後我們想要調回其中一個任務,只要輸入命令fg+任務ID號就可以,比如我們想調回2.txt的編輯任務,就要輸入fg 2就可以了。

我們也可以將命令放到後臺去運行。輸入命令bg 2
[root@localhost ~]# bg 2
[2]+ vim 2.txt &(這相當於後臺運行)
再比如
[root@localhost ~]# sleep 100
^Z
[2]+ 已停止 sleep 100
[root@localhost ~]# bg 2
[2]+ sleep 100 &
[root@localhost ~]# jobs
[1]+ 已停止 sleep 180
[2]- 運行中 sleep 100 &

除此之外,我們還可以將命令一次性的放到後臺去,就是在命令後面加上“&”
[root@localhost ~]# sleep 100 &
[1] 1223
[root@localhost ~]# jobs
[1]+ 運行中 sleep 100 &
這樣的話後可以將一條命令放到後臺去進行,但是在另一個終端我們是看不到我們本終端的任務的,但是能查看進程。

變量
centos系統內變量包括PATH,HOME,PWD,LOGNAME等等,那麽這些變量是在哪裏規定的呢?我們可以通過命令env來獲取這些系統變量。
env是查看系統常用的環境變量的,除了env,還有set,這個命令不僅可以查看系統內的環境變量,也可以查看用戶自定義的環境改變量。

[root@localhost ~]# env | head -5
XDG_SESSION_ID=1
HOSTNAME=localhost.localdomain
SELINUX_ROLE_REQUESTED=
TERM=linux
SHELL=/bin/bash
等號的左邊是變量的名字,右邊是值。系統的變量通常都是大寫的英文字母,但是變量的值就不一定是字母了,有時會是字母,有時會是數字。

我們也可以自定義變量,比如
[root@localhost ~]# a=111
[root@localhost ~]# echo $a
111
這是我們自定義的變量,而不是我們系統自帶的變量,這個變量就可以用set命令查到
[root@localhost ~]# set | grep 111
a=111

變量名的規則:首先系統的環境變量是系統內置的,我們沒有權利幹涉他,但我們可以修改配置文件。我們也可以自定義變量,首先我們先給變量定一個名字,變量的名字是由字母、數字、下劃線組成,但首位不能是數字。
[root@localhost ~]# a1=2
[root@localhost ~]# echo $a1
2
[root@localhost ~]# a=4
[root@localhost ~]# echo $a

4
[root@localhost ~]# _a1=5
[root@localhost ~]# echo $_a1
5
[root@localhost ~]# 1a=5
-bash: 1a=5: 未找到命令
由此可以看出,變量的首位除了數字,都可以執行。

變量的值有特殊符號時需要用單引號括起來,比如我們要執行變量a=a b c
[root@localhost ~]# a=a b c
-bash: b: 未找到命令
由於後邊的值中有空格的存在,所以變量沒喲形成,他只會認為a=a,而後邊的b,c他會理解為是一個命令,會報錯。所以我們要用‘’括起來,這裏建議用單引號,這樣可以脫意
[root@localhost ~]# a=‘a b c‘
[root@localhost ~]# echo $a
a b c
如果用雙引號“”的話會出現特殊符號不識別的情況
[root@localhost ~]# a="a$bc"
[root@localhost ~]# echo $a
a
所以,有特殊符號的時候要用單引號‘’
[root@localhost ~]# a=‘a$bc‘
[root@localhost ~]# echo $a
a$bc

變量的累加
我們的變量是可以累加輸出的,比如
[root@localhost ~]# a=1
[root@localhost ~]# b=2
[root@localhost ~]# echo $a$b
12
這樣就可以將兩個變量同時輸出

[root@localhost ~]# a=‘a$bc‘
[root@localhost ~]# echo $a
a$bc
加單引號脫意

[root@localhost ~]# c="a$b"c
[root@localhost ~]# echo $c
a2c
這裏面直接把$b看成了一個賦值的變量,因為前面已經是b=2,c=a所以這裏的輸出就是a2c。如果我們的變量比較復雜,那麽我們最好用單引號。

全局變量
我們先做一個實驗,先定義aming=linux
[root@localhost ~]# aming=linux
[root@localhost ~]# echo $aming
linux
然後我們打開另一個回話或者進入另一個bash
[root@localhost ~]# bash
[root@localhost ~]# echo $aming

[root@localhost ~]#
這時我們發現剛才定義的aming並沒有得出自定義結果的值的,我們把這樣的定義變量叫做非全局變量,也可以叫做本地變量,他只在當前終端下生效。

那我們怎樣將它變成一個全局變量呢?用命令export
[root@localhost ~]# export aming=linux
[root@localhost ~]# echo $aming
linux
[root@localhost ~]# bash
[root@localhost ~]# echo $aming
linux
這樣就變成了全局變量。而且這種全局變量只能是從上向下,而不能從下向上,也不能在另一個終端上生效。

取消變量unset
[root@localhost ~]# unset aming
[root@localhost ~]# echo $aming
這樣就取消了自定義變量。

export的語法:export 變量名=變量值,全局變量也只在子shell下生效,輸入bash就進入一個bash。

環境變量的配置文件
環境變量文件分為兩個維度,一個維度是系統層次(etc下的),另一個維度是用戶層次(家目錄下的 ~/.)。系統層次有/etc/porfile,/etc/bashrc,這兩個文件我們最好不要去編輯它。
用戶層次包括~/.bashrc,~/.bash_profile。我們可以編輯用戶家目錄下的這兩個文件。~/.bash_profile會調用~/.bashrc,而~/.bashrc會調用~/.bashrc。
profile和bashrc這兩種文件的區別在於,profile是在用戶登錄的時候它就會自動的加載Profile,而profile會自定的調用bashrc。而bashrc是執行shell腳本的時候,用戶不用登陸就可以執行腳本,而執行腳本就要調用bashrc裏面的一些配置。
~/.bash_history。
~/.bash_logout用來定義用戶退出的時候需要做的一些操作

shell變量,管道符,作業控制,shell變量,以及變量配置文件