shell腳本

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é):

  1. 變量的設(shè)置
  2. 變量的引用
  3. 刪除變量

(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 {}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掏缎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子煤杀,更是在濱河造成了極大的恐慌眷蜈,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沈自,死亡現(xiàn)場離奇詭異酌儒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)枯途,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門忌怎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來籍滴,“玉大人,你說我怎么就攤上這事呆躲∫熘穑” “怎么了捶索?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵插掂,是天一觀的道長。 經(jīng)常有香客問我腥例,道長辅甥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任燎竖,我火速辦了婚禮璃弄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘构回。我一直安慰自己夏块,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布纤掸。 她就那樣靜靜地躺著脐供,像睡著了一般。 火紅的嫁衣襯著肌膚如雪借跪。 梳的紋絲不亂的頭發(fā)上政己,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機(jī)與錄音掏愁,去河邊找鬼歇由。 笑死,一個(gè)胖子當(dāng)著我的面吹牛果港,可吹牛的內(nèi)容都是我干的沦泌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辛掠,長吁一口氣:“原來是場噩夢啊……” “哼谢谦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起公浪,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤他宛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后欠气,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厅各,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年预柒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了队塘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袁梗。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖憔古,靈堂內(nèi)的尸體忽然破棺而出遮怜,到底是詐尸還是另有隱情,我是刑警寧澤鸿市,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布锯梁,位于F島的核電站,受9級特大地震影響焰情,放射性物質(zhì)發(fā)生泄漏陌凳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一内舟、第九天 我趴在偏房一處隱蔽的房頂上張望合敦。 院中可真熱鬧,春花似錦验游、人聲如沸充岛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽崔梗。三九已至,卻和暖如春赔硫,著一層夾襖步出監(jiān)牢的瞬間炒俱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工爪膊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留权悟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓推盛,卻偏偏與公主長得像峦阁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子耘成,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容