1.建立和運(yùn)行shell程序
什么是shell程序呢? 簡單的說shell程序就是一個(gè)包含若干行
shell或者linux命令的文件.
象編寫高級語言的程序一樣,編寫一個(gè)shell程序需要一個(gè)文本編輯器.如VI等.
在文本編輯環(huán)境下,依據(jù)shell的語法規(guī)則,輸入一些shell/linux命令行,形成一個(gè)完整的程序文件.
執(zhí)行shell程序文件有三種方法
(1)#chmod +x file
(2)#sh file
(3)# . file
在編寫shell時(shí),第一行一定要指明系統(tǒng)需要那種shell解釋你的shell程序,如:#!/bin/bash
Unix/Linux上常見的Shell腳本解釋器有bash惊奇、sh、csh浊吏、ksh等,習(xí)慣上把它們稱作一種Shell城丧。我們常說有多少種Shell室囊,其實(shí)說的是Shell腳本解釋器。
- shell腳本的基本元素
#!<命令解釋器>
# --為注示
shell命令
流程控制(if/for/while/case/function)
- 為什么使用shell
解決重復(fù)操作的作業(yè)
節(jié)約時(shí)間,提高工作效率
功能強(qiáng)大
不需要編譯
- shell通配符
仰坦? 任意單個(gè)字符,不能匹配空
* 任意零個(gè)或多個(gè)字符組(不能匹配以點(diǎn)開頭的文件)
[ab] a或者b
[a-z] a到z之間的任意字符蘸嘶,包括端點(diǎn)在內(nèi)
是Shell 而非命令本身處理通配符良瞧,命令后的通配符會在命令執(zhí)行前就被代換了
如果需要命令而非Shell處理通配符,請用“\"將通配符轉(zhuǎn)義训唱,跳脫字符
- bash中的引號
雙引號 “ ” :允許通過$符號引用其他變量值褥蚯,會把引號的內(nèi)容當(dāng)成整體來看待
單引號 ‘ ’ :禁止引用其他變量值,shell中特殊符號都被視為普通字符况增,會把引號的內(nèi)容當(dāng)成整體來看待
反撇號 `` : 會把命令執(zhí)行的結(jié)果輸出
$() 在執(zhí)行命令的過程中會優(yōu)先執(zhí)行
; 連續(xù)執(zhí)行命令
&& 可對一行命令進(jìn)行分割赞庶,在執(zhí)行過程中考慮上一個(gè)命令執(zhí)行是否是正確的
|| 可對一行命令進(jìn)行分割,在執(zhí)行過程中不考慮上一個(gè)命令執(zhí)行是否是正確的
! 命令歷史
# echo "This system is "HOSTNAME""
This is system is HOSTNAME
# echo "This system is "$HISTNAME""
This is system is
# echo "This system is "$HOSTNAME""
This is system is desktop8.example.com
# echo 'This system is "$HOSTNAME"'
This is system is "$HOSTNAME"
[root@desktop8 ~]# echo $5.00
5.00
[root@desktop8 ~]# echo \$5.00
$5.00
echo `ls`cat aaa.sh ``
# 將cmd1執(zhí)行結(jié)果作為cmd2參數(shù)澳骤,再將cmd2結(jié)果作為cmd3的參數(shù)
echo $(cat $(ls))
cmd3 $(cmd2 $(cmd1))
echo `cat ddd`ls``
ls && cat ddd
lsa || cat ddd
運(yùn)算符
$(()) :運(yùn)算符
$[]
# a=$((1 + 10))
# echo $a
# a=$[1 + 100]
# echo $a
[root@vagrant-centos65 data]# aaa=$((10-1))
[root@vagrant-centos65 data]# echo $aaa
9
[root@vagrant-centos65 data]# aaa=$((10*1))
[root@vagrant-centos65 data]# echo $aaa
10
[root@vagrant-centos65 data]# aaa=$((9/3))
[root@vagrant-centos65 data]# echo $aaa
3
[root@vagrant-centos65 data]# aaa=$((9%3))
[root@vagrant-centos65 data]# echo $aaa
0
[root@vagrant-centos65 data]# aaa=$((9**3))
[root@vagrant-centos65 data]# echo $aaa
729
- shell的配置文件(軟件+配置文件)
用戶加載shell配置流程:
user01-->login-->bash-->/etc/profile-->$HOME/.bash_profile-->$HOME/.bashrc-->/etc/bashrc
全局配置文件
/etc/profile --bash工作環(huán)境的配置(環(huán)境變量)
export i=11
/etc/profile.d/*.sh --/etc/profile的擴(kuò)展配置文件
/etc/bashrc --bash的配置文件
針對每個(gè)用戶的配置文件:
$HOME/.bash_history --存放命令歷史
$HOME/.bash_logout --注銷/退出shell的時(shí)候執(zhí)行的腳本
$HOME/.bash_profile
$HOME/.bashrc
- 常用的幾個(gè)命令
ctrl + u --刪除當(dāng)前光標(biāo)至行首內(nèi)容
ctrl + c --中斷
ctrl + l --清屏
ctrl + a --跳到行首 HOME
crtl + e --路到行尾 END
ctrl + r --快速搜索history命令
ctrl + z --轉(zhuǎn)入后臺運(yùn)行 fg bg
Ctrl + d --退出shell歧强,logout
↑(Ctrl+p) 顯示上一條命令
↓(Ctrl+n) 顯示下一條命令
- alias --查詢系統(tǒng)中所有已經(jīng)存在的別名
alias 別名=‘真名’
unalias --取消系統(tǒng)中的別名
unalias 別名
unalias -a 刪除所有的別名
臨時(shí): alias la='ls -a'
固定:
可以寫至以下文件,定義完成需要使用source來刷新宴凉,或者注銷重新登錄用戶:
/etc/profile
$HOME/.bash_profile
$HOME/.bashrc
/etc/bashrc
/etc/profile.d/*.sh
- 歷史命令
history 查詢當(dāng)前用戶用過的所有命令歷史(內(nèi)存)
history -w 同步內(nèi)存中的命令至硬盤($/HOME/.bash_history)
自動同步:exit/注銷
echo "" > $HOME/bash_history --清空命令歷史
調(diào)用命令歷史:
!101 通過編號
!! 調(diào)用最后一條命令歷史
!vim 調(diào)用離我最近一條以vim開頭的命令歷史
!$ 調(diào)用最后一條命令歷史中的參數(shù)
命令字 + [選項(xiàng)] + 參數(shù)
ls -l /
ctrl + r 查找命令歷史
- bash的特殊符號
標(biāo)準(zhǔn)輸入 0
標(biāo)準(zhǔn)正確輸出(屏幕) 1
錯(cuò)誤輸出 (屏幕) 2
> --輸出覆蓋重定向
>> --輸出追加重定向
2> --錯(cuò)誤覆蓋輸出重定向
2>> --錯(cuò)誤追加輸出重定向
&> --輸出正確/錯(cuò)誤重定向
&>> --RHEL6可以實(shí)現(xiàn)正確和錯(cuò)誤追加重定向誊锭。
>> --- 2>&1 rhel5
# cat /root/a2.txt /root &> a.txt --將正確和錯(cuò)誤一起覆蓋重定向至a.txt
cat /root/a2.txt /root >> a.txt 2>&1 --將正確和錯(cuò)誤一起追加重定向至a.txt
[root@i ~]# ls /ttttt /etc/passwd- >1.txt 2>2.txt && &>3.txt
2.shell中的變量
(1)常用系統(tǒng)變量
# :保存程序命令行參數(shù)的數(shù)目
? :保存前一個(gè)命令的返回碼
0 :保存程序名
* :以(" 1 2...")的形式保存所有輸入的命令行參數(shù) 所有的參數(shù)會被當(dāng)做一個(gè)字符串
@ :以(" 1"" 2"...)的形式保存所有輸入的命令行參數(shù) 所有的參數(shù)會以空格做分隔符單做一個(gè)字符串
(2)定義變量
shell語言是非類型的解釋型語言,不象用C++/JAVA語言編程時(shí)需要事先聲明變量.給一個(gè)變量賦值,實(shí)際上就是定義了變量.
在linux支持的所有shell中,都可以用賦值符號(=)為變量賦值.
如: abc=9
由于shell程序的變量是無類型的,所以用戶可以使用同一個(gè)變量時(shí)而存放字符時(shí)而存放整數(shù). 如:name=abc (bash/pdksh)
在變量賦值之后,只需在變量前面加一個(gè) 去引用.
echo $abc
刪除變量:
unset abc
(3)位置變量
當(dāng)運(yùn)行一個(gè)支持多個(gè)命令行參數(shù)的shell程序時(shí),這些變量的值將分別存放在位置變量里. 其中第一個(gè)參數(shù)存放在位置變量1,第二個(gè)參數(shù)存放在位置變量2,依次類推...,shell保留這些變量,不允許用戶以令外的方式定義他們.同別的變量,用 符號引用他們.
總結(jié):
- 變量的設(shè)置
- 變量的引用
- 刪除變量
(4)內(nèi)置bash中變量
$#:命令行中位置變量的個(gè)數(shù)
$*:所有位置變量的內(nèi)容
$@: 所有位置參數(shù)的內(nèi)容,與$*的分割任不一樣,建議和所有的位置參數(shù)時(shí)使用這種方式弥锄。
$?:上一條命令執(zhí)行后返回的狀態(tài),當(dāng)返回狀態(tài)值為0時(shí)表示執(zhí)行正常,非0值表示執(zhí)行異匙严荆或出錯(cuò)
$$:當(dāng)前所在進(jìn)程的進(jìn)程號
$!:后臺運(yùn)行的最后一個(gè)進(jìn)程號
$0:當(dāng)前執(zhí)行的進(jìn)程/程序名
3.shell中引號的使用方法
shell使用引號(單引號/雙引號)和反斜線("")用于向shell解釋器屏蔽一些特殊字符. 反引號(")對shell則有特殊意義.
如: abc="how are you" (bash/pdksh)
這個(gè)命令行把三個(gè)單詞組成的字符串how are you作為一個(gè)整體賦值給變量abc.
abc1='$LOGNAME,how are you!' (bash/pdksh)
abc2="$LOGNAME,how are you!" (bash/pdksh)
LOGNAME變量是保存當(dāng)前用戶名的shell變量,假設(shè)他的當(dāng)前值是:wang.執(zhí)行完兩條命令后, abc1的內(nèi)容是LOGNAME, how are you!.而abc2的內(nèi)容是;wang, how are you!.
象單引號一樣,反斜線也能屏蔽所有特殊字符.但是他一次只能屏蔽一個(gè)字符.而不能屏蔽 一組字符.
反引號的功能不同于以上的三種符號.他不具有屏蔽特殊字符的功能.但是可以通過他將一個(gè)命令的運(yùn)行結(jié)果傳遞給另外一個(gè)命令.
如:
contents=ls
(bash/pdksh)
4.shell程序中的test命令
- 算術(shù)操作(expr)
在bash中只能做整數(shù)的運(yùn)算
+ 加
- 減
* 乘
/ 除(取整)
% 取余
$(())
$[]
[root@vagrant-centos65 data]# aa=$((10-1))
[root@vagrant-centos65 data]# echo $aa
9
[root@vagrant-centos65 data]# bb=$[10/10]
[root@vagrant-centos65 data]# echo $bb
1
[root@vagrant-centos65 data]# cc=$[10+10]
[root@vagrant-centos65 data]# echo $cc
20
- 退出狀態(tài)
在Linux系統(tǒng)中温治,每當(dāng)命令執(zhí)行完成后,系統(tǒng)都會返回一個(gè)退出狀態(tài)戒悠。該退出狀態(tài)用一整數(shù)值表示熬荆,用于判斷命令運(yùn)行正確與否。
若退出狀態(tài)值為0绸狐,表示命令運(yùn)行成功
若退出狀態(tài)值不為0時(shí)卤恳,則表示命令運(yùn)行失敗
最后一次執(zhí)行的命令的退出狀態(tài)值被保存在內(nèi)置變量“$?”中,所以可以通過echo語句進(jìn)行測試命令是否運(yùn)行成功
0 表示運(yùn)行成功寒矿,程序執(zhí)行未遇到任何問題
1~125 表示運(yùn)行失敗突琳,腳本命令、系統(tǒng)命令錯(cuò)誤或參數(shù)傳遞錯(cuò)誤
126 找到了該命令但無法執(zhí)行
>128 命令被系統(tǒng)強(qiáng)制結(jié)束
test命令
用途:測試特定的表達(dá)式是否成立符相,當(dāng)條件成立時(shí)拆融,命令執(zhí)行后的返回值$?為0,否則為其他數(shù)值
格式: test 條件表達(dá)式
[ 條件表達(dá)式 ]
test可以測試表示有哪些:
1啊终、文件狀態(tài)
2镜豹、字符串的比對
3、整數(shù)的比對
4蓝牲、多條件組合(|| && !)(-a -o !)
#man test
-a = && -o = || !
單個(gè)條件: [ ! 1 -eq 1 ] 兩個(gè)值的結(jié)果再取反 趟脂,感嘆號的優(yōu)先級別最低,除非加括號例衍;
! [ 1 -eq 1 ]
多個(gè)條件:
[ 1 -eq 1 -a 10 -eq 10 ] = [ 1 -eq 1 ] && [ 10 -eq 10 ] 兩個(gè)條件成立散怖,才正確;
[ 1 -eq 1 -o 10 -eq 10 ] = [ 1 -eq 1 ] || [ 10 -eq 10 ] 取或肄渗;
[ 1 -eq 1 -o 10 -eq 10 -o 1 -eq 1 ] = [ 1 -eq 1 ] || [ 10 -eq 10 ] || [ 1 -eq 1 ]
-----------------------------------------------------
# test 1 = 1
# echo $?
0
# [ 1 = 1 ] --[] = test --單條件
# echo $?
0
# [ 1 = 1 ] && echo YES
YES
# [ 1 = 2 ] && echo YES --無返回
|| -o or
&& -a and
!
條件的組合:
[ 1 = 1 -a 1 = 2 ] 與組合
[ 1 = 1 ] && [ 1 = 2 ] 與組合
[ 1 = 1 ] || [ 1 = 2 ] 或組合
[ 1 = 1 -o 1 = 2 ] 或組合
在bash中,命令test用于計(jì)算一個(gè)條件表達(dá)式的值.他們經(jīng)常在條件語句和循環(huán)語句中被用來判斷某些條件是否滿足.
test命令的語法格式:
test expression
或者
[expression]
- 邏輯運(yùn)算符
邏輯運(yùn)算符主要包括邏輯非镇眷、邏輯與、邏輯或運(yùn)算符翎嫡,具體描述如下表所示:
邏輯操作符 描述
欠动!expression 如果expression為假,則測試結(jié)果為真
expression1 a expression2 如果expression1和expression同時(shí)為真惑申,則測試結(jié)果為真
expression1 o expression2 如果expression1和expression2中有一個(gè)為真具伍,則測試條件為真
在test命令中,可以使用很多shell的內(nèi)部操作符.這些操作符介紹如下:
(1)字符串操作符 用于計(jì)算字符串表達(dá)式
test命令 | 含義
Str1 = str2 | 當(dāng)str1與str2相同時(shí),返回True
Str1! = str2| 當(dāng)str1與str2不同時(shí),返回True
Str | 當(dāng)str不是空字符時(shí),返回True
-n str | 當(dāng)str的長度大于0時(shí),返回True
-z str | 當(dāng)str的長度是0時(shí),返回True
(2)整數(shù)操作符具有和字符操作符類似的功能.只是他們的操作是針對整數(shù)
test表達(dá)式 | 含義
Int1 -eq int2|當(dāng)int1等于int2時(shí),返回True
Int1 -ge int2|當(dāng)int1大于/等于int2時(shí),返回True
Int1 -le int2|當(dāng)int1小于/等于int2時(shí),返回True
Int1 -gt int2|當(dāng)int1大于int2時(shí),返回True
Int1 -ne int2|當(dāng)int1不等于int2時(shí),返回True
(3)用于文件操作的操作符,他們能檢查:文件是否存在,文件類型等
test表達(dá)式 | 含義
-d file |當(dāng)file是一個(gè)目錄時(shí),返回 True
-f file |當(dāng)file是一個(gè)普通文件時(shí),返回 True
-r file |當(dāng)file是一個(gè)刻讀文件時(shí),返回 True
-s file |當(dāng)file文件長度大于0時(shí),返回 True
-w file |當(dāng)file是一個(gè)可寫文件時(shí),返回 True
-x file |當(dāng)file是一個(gè)可執(zhí)行文件時(shí),返回 True
(4)shell的邏輯操作符用于修飾/連接包含整數(shù),字符串,文件操作符的表達(dá)式
test表達(dá)式 | 含義
! expr |當(dāng)expr的值是False時(shí),返回True
Expr1 -a expr2|當(dāng)expr1,expr2值同為True時(shí),返回True
Expr1 -o expr2|當(dāng)expr1,expr2的值至少有一個(gè)為True時(shí),返回True
5.條件語句
同其他高級語言程序一樣,復(fù)雜的shell程序中經(jīng)常使用到分支和循環(huán)控制結(jié)構(gòu),
bash,pdksh分別都有兩種不同形式的條件語句:if語句和case語句.
(1)if語句
語法格式:
bash/pdksh用法:
if [expression1]
then
commands1
elif [expression2]
commands2
else
commands3
if
含義:當(dāng)expression1的條件為True時(shí),shell執(zhí)行then后面的commands1命令;當(dāng)
expression1的條件為false并且expression2的條件滿足為True時(shí),shell執(zhí)行
commands2命令;當(dāng)expression1和expressin2的條件值同為false時(shí),shell執(zhí)行
commands3命令.if語句以他的反寫fi結(jié)尾.
(2)case語句
case語句要求shell將一個(gè)字符串S與一組字符串模式P1,P2,...,Pn比較,當(dāng)S與
某個(gè)模式Pi想匹配時(shí),就執(zhí)行相應(yīng)的那一部分程序/命令.shell的case語句中字符
模式里可以包含象*這樣的通配符.
語法格式:
bash/pdksh用法:
case string1 in
str1)
commands1;;
str2)
commands2;;
*)
commands3;;
esac
含義:shell將字符串string1分別和字符串模式str1和str2比較.如果string1與str1匹配,則shell執(zhí)行commands1的命令/語句;如果string11和str2匹配,則shell執(zhí)行commands2的命令/語句.否則shell將執(zhí)行commands3的那段程序/命令.其中,每個(gè)分支的程序/命令都要以兩個(gè)分號(;;)結(jié)束.
6.循環(huán)語句
當(dāng)需要重復(fù)的某些操作時(shí),就要用到循環(huán)語句
(1)for語句
大家知道在很多編程語言中for語句是最常見.在shell中也不例外.for語句要求shell將包含
在這個(gè)語句中的一組命令連續(xù)執(zhí)行一定的次數(shù).
語法格式:
bash/pdksh
用法1:
for var1 in list
do
commands
done
含義:在這個(gè)for語句中,對應(yīng)于list中的每個(gè)值,shell將執(zhí)行一次commands代表的一組命令.
在整個(gè)循環(huán)的每一次執(zhí)行中,變量var1將依此取list中的不同的值.
用法2:
for var1
do
setatements
done
含義:在這個(gè)for語句中,shell針對變量var1中的每一項(xiàng)分別執(zhí)行一次statements代表的一組
命令.當(dāng)使用這種形式的語句時(shí),shell認(rèn)為var1變量中包含了所有的位置變量,而位置變量中
存放著程序的命令行參數(shù)值.也就是說,他等價(jià)于下列形式:
for var1 in " @"
do
statements
done
舉例:
for file ;bash/pdksh
do
tr a-z A-Z< file>file.caps
done
(2)while語句
while語句是shell提供的另一種循環(huán)語句. while語句指定一個(gè)表達(dá)式和一組命令.這個(gè)語句使得shell重復(fù)執(zhí)行一組命令,直到表達(dá)式的值為False為止.
語法格式:
while expression ;bash
do
statements
done
舉例:
#!/bin/bash
count=1
while true
do
echo "this is a parameter number $count $1"
shift
count=$[ $count+1 ]
done
語句中shift命令的功能是將所有的命令行參數(shù)依次相左傳遞.
7.shell中的函數(shù)
1、在編寫Shell腳本程序時(shí)圈驼,將一些需要重復(fù)使用的命令操作人芽,定義為公共使用的語句塊,即可稱為函數(shù)
2绩脆、合理使用Shell函數(shù)萤厅,可以使腳本內(nèi)容更加簡潔橄抹,增強(qiáng)程序的易讀性,提高執(zhí)行效率
shell允許用戶定義自己的函數(shù).函數(shù)是高級語言中的重要結(jié)構(gòu).shell中的函數(shù)于C或
者其他 語言中定義的函數(shù)一樣.與從頭開始,一行一行地寫程序相比,使用函數(shù)主要好處是有 利于組織 整個(gè)程序.在bash中,一個(gè)函數(shù)的語法格式如下:
fname (){
shell comands
}
定義好函數(shù)后,需要在程序中調(diào)用他們.bash中調(diào)用函數(shù)的格式:
fname [parm1 parm2 parm3...]
調(diào)用函數(shù)時(shí),可以向函數(shù)傳遞任意多個(gè)參數(shù).函數(shù)將這些參數(shù)看做是存放他的命令行參數(shù)的 位置變量
總結(jié)
利用shell編程是提高系統(tǒng)管理工作效率的重要手段,學(xué)好shell跟了解系統(tǒng)基本命令
和管理工具的使用方法同樣重要!
附:
A.bash中常用的命令
命令 | 含義
& 把程序放到后臺執(zhí)行
ctrl + z 可以將一個(gè)正在前臺執(zhí)行的命令放到后臺惕味,并且暫停
Alias |設(shè)置命令別名
Bg |將一個(gè)被掛起的進(jìn)程在后臺執(zhí)行
cd |改變用戶的當(dāng)前目錄
exit |終止一個(gè)shell
export |使作為這個(gè)命令的參數(shù)的變量及其當(dāng)前值,在當(dāng)前運(yùn)行的shell的子進(jìn)程中可見
fc |編輯當(dāng)前的命令行歷史列表
fg |讓一個(gè)被掛起的進(jìn)程在前臺執(zhí)行
help |顯示bash內(nèi)部命令的幫助信息
history |顯示最近輸入的一定數(shù)量的命令行
kill |終止一個(gè)進(jìn)程
pwd |顯示用戶當(dāng)前工作目錄
unalias |刪除命令行別名
B.bash中常用的系統(tǒng)變量
變量 | 含義
EDITOR,FCEDIT |Bash的fc命令的默認(rèn)文本編輯器
HISTFILE |規(guī)定存放最近輸入命令行文件的名字
HISTSIZE |規(guī)定命令行歷史文件的大小
HOME |當(dāng)前用戶的宿主目錄
OLDPWD |用戶使用的前一個(gè)目錄
PATH |規(guī)定bash尋找可執(zhí)行文件時(shí)搜索的路徑
PS1 |命令行環(huán)境中顯示第一級提示符號
PS2 |命令行環(huán)境中顯示第二級提示符號
PWD |用戶當(dāng)前工作目錄
SECONDS |當(dāng)前運(yùn)行的bash進(jìn)程的運(yùn)行時(shí)間(以秒為單位)一
排序統(tǒng)計(jì)相關(guān)的:wc sort uniq
wc
-l 顯示行數(shù)
-w 顯示單詞數(shù)
-m 顯示字符數(shù)
默認(rèn)不加參數(shù)楼誓,就是相當(dāng)于上面三個(gè)參數(shù)都加
[root@li shell01]# cat /etc/passwd |wc -l
79
[root@li shell01]# cat /etc/passwd |wc -w
106
[root@li shell01]# cat /etc/passwd |wc -m
3374
[root@li shell01]# cat /etc/passwd |wc
79 106 3374
wc -L 算一個(gè)文件里最長一行有多少個(gè)字符
sort 排序命令
[root@li shell01]# cat /etc/passwd |
sort --默認(rèn)以開頭字母排序
-r 反向排序
-n 以數(shù)字來排
-f 大小寫不敏感
-t 分隔符
-k 接數(shù)字代表第幾列
cut [-bn] [file] 或 cut [-c] [file] 或 cut [-df] [file]
cut 命令從文件的每一行剪切字節(jié)、字符和字段并將這些字節(jié)名挥、字符和字段寫至標(biāo)準(zhǔn)輸出疟羹。
如果不指定 File 參數(shù),cut 命令將讀取標(biāo)準(zhǔn)輸入禀倔。必須指定 -b榄融、-c 或 -f 標(biāo)志之一。
-b :以字節(jié)為單位進(jìn)行分割救湖。這些字節(jié)位置將忽略多字節(jié)字符邊界愧杯,除非也指定了 -n 標(biāo)志。
-c :以字符為單位進(jìn)行分割。
-d :自定義分隔符,默認(rèn)為制表符臀防。
-f :與-d一起使用,指定顯示哪個(gè)區(qū)域畏邢。
-n :取消分割多字節(jié)字符。僅和 -b 標(biāo)志一起使用检吆。如果字符的最后一個(gè)字節(jié)落在由 -b 標(biāo)志的 List 參數(shù)指示的<br />范圍之內(nèi)舒萎,該字符將被寫出;否則蹭沛,該字符將被排除臂寝。
[root@li ~]# cut -d -f
[root@li ~]# sort -t -k
[root@li ~]# awk -F n
[root@li shell01]# cat /etc/passwd |sort -t ":" -k 3 --以UID來排序,但是它只會以數(shù)字的第一個(gè)數(shù)字來排也就是說 2要排到14的后面
[root@li shell01]# cat /etc/passwd |sort -t ":" -k 3 -n --多加一個(gè)-n參數(shù)摊灭,才會以整個(gè)的數(shù)字大小來排序
uniq 唯一命令
默認(rèn)是以連續(xù)的重復(fù)值內(nèi)只取一個(gè)
[root@li shell01]# cat /etc/passwd |cut -d ":" -f7 |uniq |grep bash
/bin/bash
/bin/bash
/bin/bash
/bin/bash
[root@li shell01]# cat /etc/passwd |cut -d ":" -f7 |grep bash |uniq
/bin/bash
--在管道用得多的情況下咆贬,命令的順序會造成很大的結(jié)果不同
---------------------------------
練習(xí):
對有下面內(nèi)容的文件進(jìn)行操作
http://a.domain.com/1.html
http://b.domain.com/1.html
http://c.domain.com/1.html
http://a.domain.com/2.html
http://a.domain.com/3.html
http://b.domain.com/3.html
http://c.domain.com/2.html
http://c.domain.com/3.html
http://a.domain.com/1.html
得到下面的結(jié)果
4 a.domain.com
3 c.domain.com
2 b.domain.com
cat 1.txt |cut -d"/" -f3 |sort|uniq -c |sort -n -r
- bash的調(diào)試方法
打開調(diào)試模式
? $set -x
? $bash -x shell.sh
? 關(guān)閉調(diào)試模式
? $set +x
sh -n test.sh --檢查語法(結(jié)構(gòu)化語句的語法)
sh -x test.sh --調(diào)試
如果參數(shù)過太多,出現(xiàn)這個(gè)報(bào)錯(cuò):too many arguments帚呼,需要使用xargs
xargs (1) - build and execute command lines from standard input
# awk -F: '{print $1}' /etc/passwd | xargs -i mkdir -p {}