內(nèi)建命令
所謂內(nèi)建命令铸史,就是bash自身提供的命令,不是外部可執(zhí)行程序文件怯伊,可以用type來(lái)確定一個(gè)命令是否內(nèi)建命令琳轿。
$PATH 變量包含的目錄,都是外部命令
內(nèi)建命令相當(dāng)于調(diào)用shell進(jìn)程的一個(gè)函數(shù)耿芹,比外部命令執(zhí)行的快
type cd
type ifconfig
- Bash Shell 內(nèi)建命令
命令 | 說(shuō)明 |
---|---|
: | 擴(kuò)展參數(shù)列表崭篡,執(zhí)行重定向操作 |
. | 讀取并執(zhí)行指定文件中的命令,在當(dāng)前shell環(huán)境中 |
alias | 為指定命令定義個(gè)別名 |
bg | 將作業(yè)以后臺(tái)模式運(yùn)行 |
bind | 將鍵盤序列綁定到一個(gè)readline 函數(shù)或宏 |
break | 退出for吧秕、while琉闪、select或until循環(huán) |
builtin | 執(zhí)行指定的shell內(nèi)建命令 |
caller | 返回活動(dòng)子函數(shù)調(diào)用的上下文 |
cd | 將當(dāng)前目錄切換為指定的目錄 |
command | 執(zhí)行指定的命令,無(wú)需進(jìn)行通常的shell查找 |
compgen | 為指定單次生成可能的補(bǔ)全匹配 |
complete | 顯示指定的單次時(shí)候如何補(bǔ)全的 |
compopt | 修改指定單次的不全選項(xiàng) |
continue | 繼續(xù)執(zhí)行for砸彬、while颠毙、select或 until循環(huán)的下一次迭代 |
declare | 生命一個(gè)變量或變量的類型 |
dirs | 顯示當(dāng)前存儲(chǔ)目錄的列表 |
disown | 從進(jìn)場(chǎng)作業(yè)表中刪除指定的作業(yè) |
echo | 指定字符串輸出到STDOUT |
enable | 啟用或禁用指定的內(nèi)建shell命令 |
eval | 將指定的參數(shù)拼接成一個(gè)命令斯入,然后執(zhí)行該命令 |
exec | 指定命令替換shell進(jìn)程 |
exit | 強(qiáng)制shell以指定的退出狀態(tài)碼退出 |
export | 設(shè)置子shell進(jìn)程可用的變量 |
fc | 從歷史記錄中選擇命令列表 |
fg | 將作業(yè)以前臺(tái)模式運(yùn)行 |
getopts | 分析指定的位置參數(shù) |
hash | 查找并記住指定命令的全路徑名 |
help | 顯示幫助文檔 |
history | 顯示命令歷史記錄 |
jobs | 列出活動(dòng)作業(yè) |
kill | 向指定的進(jìn)程ID發(fā)送一個(gè)系統(tǒng)信號(hào) |
let | 計(jì)算一個(gè)數(shù)學(xué)表達(dá)式中的每個(gè)參數(shù) |
local | 在函數(shù)中創(chuàng)建一個(gè)作業(yè)域受限的變量 |
logout | 退出shell登錄 |
mapfile | 從STDIN讀取數(shù)據(jù)行,并將其加入索引數(shù)組 |
popd | 從目錄棧中刪除記錄 |
printf | 使用格式化字符串顯示文本 |
pushd | 向目錄棧添加一個(gè)目錄 |
pwd | 顯示當(dāng)前工作目錄的路徑名 |
read | 從STDIN讀取一行數(shù)據(jù)并將其賦給一個(gè)變量 |
readarray | 從STDIN讀取數(shù)據(jù)行并將其放入索引數(shù)據(jù) |
return | 強(qiáng)制函數(shù)以某一個(gè)值退出蛀蜜,這個(gè)值可以被調(diào)用腳本提取 |
set | 設(shè)置并顯示環(huán)境變量的值和shell屬性 |
shift | 將位置參數(shù)依次享下講一個(gè)位置 |
shopt | 打開/關(guān)閉控制shell可選行為的變量值 |
source | 讀取并執(zhí)行指定文件中的命令(當(dāng)前shell環(huán)境執(zhí)行) |
suspend | 暫停shell的執(zhí)行刻两,指導(dǎo)收到一個(gè)SIGCONT信號(hào) |
test | 基于指定條件返回退出狀態(tài)碼0或1 |
times | 顯示累計(jì)的用戶和系統(tǒng)時(shí)間 |
trap | 如果收到了指定的系統(tǒng)喜好,執(zhí)行指定的命令 |
type | 顯示指定的單次如果作為命令將會(huì)被如何解釋 |
typeset | 聲明一個(gè)變量或變量類型 |
ulimit | 為系統(tǒng)用戶設(shè)置指定的資源上線 |
umask | 為新建的文件或目錄設(shè)置默認(rèn)權(quán)限 |
unalias | 刪除指定的別名 |
unset | 刪除指定的環(huán)境變量或shell屬性 |
wait | 等待指定的進(jìn)程完成滴某,并返回退出狀態(tài)碼 |
echo
用來(lái)在終端輸出字符串磅摹,并在最后默認(rèn)增加換行符。
默認(rèn)不會(huì)解析\開頭的轉(zhuǎn)義字符
echo str
# -n 取消換行
echo -n str
# -e 解析轉(zhuǎn)義字符,行尾\c 取消換行
echo -e "hello \n world"
echo -e "hello \c"
read
用來(lái)從標(biāo)準(zhǔn)輸入中讀取數(shù)據(jù)賦值給變量霎奢,默認(rèn)從鍵盤讀取户誓,重定向可以從文件讀取
read [-options] [variables]
options 表示選項(xiàng),variable表示用來(lái)存儲(chǔ)數(shù)據(jù)的變量幕侠,可以多個(gè)帝美,兩者都是可選,如果沒(méi)有變量名橙依,默認(rèn)賦值給REPLY证舟。
- options 選項(xiàng)
選項(xiàng) | 說(shuō)明 |
---|---|
-a array | 讀取的數(shù)據(jù)賦值給數(shù)據(jù)array,從下標(biāo)0開始 |
-d delimiter | 用字符串delimiter指定讀取結(jié)束的位置窗骑,而不是換行數(shù)女责,不包括delimiter |
-e | 獲取數(shù)據(jù)進(jìn)行編碼轉(zhuǎn)換,不會(huì)顯示功能鍵字符 |
-n num | 讀取num個(gè)字符创译,而不是整行字符 |
-p prompt | 顯示提示信息抵知,提示內(nèi)容為prompt |
-r | 原樣讀取,不把反斜杠字符解析為轉(zhuǎn)義字符 |
-s | 靜默模式软族,不會(huì)再屏幕上顯示輸出 |
-t seconds | 設(shè)置超時(shí)時(shí)間刷喜,單位秒,沒(méi)在指定時(shí)間輸入完成立砸,非0狀態(tài)退出掖疮,讀取失敗 |
-u fd | 使用文件描述符fd作為輸入源,而不是標(biāo)準(zhǔn)輸入颗祝,類似重定向 |
- 只讀取一個(gè)字符
#!/bin/bash
read -n 1 -p "Enter a char " char
printf "\n"
echo $char
exit
用來(lái)退出當(dāng)前shell進(jìn)程浊闪,并返回一個(gè)退出狀態(tài);使用$? 可以接收返回狀態(tài)螺戳。
exit 不指定默認(rèn)0搁宾,一般0成功,非0表示執(zhí)行失敗倔幼。
#!/bin/bash
echo "befor"
exit 8
echo "after"
declare 和typeset
它們的用法相同盖腿,都是用來(lái)設(shè)置變量的屬性。 typeset 已經(jīng)廢棄。
命令語(yǔ)法
## -標(biāo)識(shí)設(shè)置屬性翩腐,+標(biāo)識(shí)取消屬性
declare [+/-] [aAfFgilpartux] [變量名=變量值]
- aAfFgliprtux 都是具體的選項(xiàng)鸟款,含義如下
選項(xiàng) | 含義 |
---|---|
-f [name] | 列出之前由用戶在腳本中定義的函數(shù)名稱和函數(shù)體 |
-F [name] | 僅列出自定義的函數(shù)名稱 |
-g name | 在Shell函數(shù)內(nèi)部創(chuàng)建局部變量 |
-p [name] | 顯示指定變量的屬性和值 |
-a name | 聲明變量為普通數(shù)組 |
-A name | 聲明變量為關(guān)聯(lián)數(shù)組(支持索引下標(biāo)為字符串) |
-i name | 將變量定義為整數(shù)型 |
-r name[=value] | 將變量定義為只讀,等價(jià)readonly name |
-x name[=value] | 將變量設(shè)置為環(huán)境變量茂卦,等價(jià)于export name[=value] |
例欠雌,
#!/bin/bash
declare -i m n ret
m=10
n=30
ret=$m+$n
echo $ret
shell 高級(jí)
- 輸入方向就是數(shù)據(jù)從哪里流向程序。默認(rèn)從鍵盤疙筹,如果改變了流入就是輸入重定向。
- 輸出方向就是數(shù)據(jù)從程序流向哪里禁炒,默認(rèn)是顯示器而咆,如果改變了流出就是輸出重定向。
linux中一切皆文件幕袱,包括標(biāo)準(zhǔn)輸入設(shè)備和標(biāo)準(zhǔn)輸出設(shè)備所有的計(jì)算機(jī)硬件都是文件暴备。問(wèn)了區(qū)分已經(jīng)打開的文件,linux會(huì)給每個(gè)文件分配一個(gè)ID们豌,這個(gè)ID是個(gè)整數(shù)涯捻,被稱為文件描述符。
文件描述符 | 文件名 | 類型 | 硬件 |
---|---|---|---|
0 | stdin | 標(biāo)準(zhǔn)輸入文件 | 鍵盤 |
1 | stdout | 標(biāo)準(zhǔn)輸出文件 | 顯示器 |
2 | stderr | 標(biāo)準(zhǔn)錯(cuò)誤輸出文件 | 顯示器 |
- Linux Shell輸出重定向
語(yǔ)法 fd>file 或 fd>>file 望迎,fd文件描述符默認(rèn)是1障癌,和>或>> 不能有空格
類型 | 符號(hào) | 作用 |
---|---|---|
標(biāo)準(zhǔn)輸出重定向 | command >file | 以覆蓋方式,把command正確結(jié)果輸出到file |
- | command >>file | 以追加方式辩尊,把command正確結(jié)果輸入到file |
標(biāo)準(zhǔn)錯(cuò)誤輸出重定向 | comand 2 >file | 覆蓋方式涛浙,錯(cuò)誤信息輸入到file |
- | command 2>>file | 追加方式,錯(cuò)誤信息輸入到file |
正確和錯(cuò)誤信息同時(shí)保存 | command >file 2>&1 | 覆蓋方式摄欲,正確和錯(cuò)誤信息同時(shí)保存到file |
- | command >>file 2>&1 | 追加方式轿亮,寫入file |
- | command >file1 2>file2 | 覆蓋方式正確寫入file1,錯(cuò)誤寫入file2 |
- | command >>file1 2>>file2 | 追加方式 |
- /dev/null 文件
如果不想寫入文件胸墙,也不想顯示器展示我注,結(jié)果重定向到/dev/null。
/dev/null 當(dāng)成linux 系統(tǒng)的垃圾箱迟隅,放到垃圾箱的數(shù)據(jù)不能恢復(fù)但骨,丟棄。
- linux shell 輸入重定向
符號(hào) | 說(shuō)明 |
---|---|
command <file | 將file文件中的內(nèi)容作為command的輸入 |
command <<END | 從標(biāo)準(zhǔn)輸入中讀取的數(shù)據(jù)玻淑,直到遇見分界符END才停止(分界符可自定義) |
command <file1 >file2 | 將file1作為command的輸入嗽冒,并將command結(jié)果輸入到file2 |
- 輸入重定向舉例,
逐行讀取文件內(nèi)容
#!/bin/bash
while read str: do
echo $str
done <readme.txt
Shell 管道詳解
將兩個(gè)或多個(gè)命令(程序或者進(jìn)程)連接到一起补履,把一個(gè)命令的輸出作為下一個(gè)命令的輸入添坊,這種方式連接兩個(gè)或多個(gè)命令就形成了管道(pipe)魄健。
管道使用|連接多個(gè)命令平夜,被稱為管道符。語(yǔ)法如下
command1 | command2 [ | commandN...]
例,
mysqldump -u root -p '123456' wiki | gzip -9 |ssh username@remote_ip "cat >/backup/wikidb.gz"
- 重定向和管道的區(qū)別
重定向操作符>將命令與文件連接起來(lái)墨叛,用文件來(lái)接收命令的輸出,而管道符|是命令與命令連接起來(lái)源请,用第二命令符接收第一個(gè)立肘。
- 管道與輸入重定向
command1 <input.txt | command2
- 管道與輸出重定向
command1 < input.txt | command2 > output.txt
過(guò)濾器
將幾個(gè)命令通過(guò)管道符組合在一起就形成了管道,通常野蝇,這種方式使用的命令稱為過(guò)濾器讼稚。
常用過(guò)濾器命令:
命令 | 描述 |
---|---|
awk | 用于文本處理的解釋性程序設(shè)計(jì)語(yǔ)言,通常是被作為數(shù)據(jù)提取和報(bào)告工具 |
cut | 用于將每個(gè)輸入文件(如果沒(méi)有指定文件绕沈,則標(biāo)準(zhǔn)輸入)每一行的指定部分锐想,輸出的標(biāo)準(zhǔn)輸出 |
grep | 用于搜索一個(gè)或多個(gè)文件中匹配指定模式的行 |
tar | 用于歸檔文件的應(yīng)用程序 |
head | 用于讀取文件的開頭部分(默認(rèn)10行),沒(méi)有指定文件乍狐,標(biāo)準(zhǔn)輸入 |
paste | 用于合并文件的行 |
sed | 用于過(guò)濾和抓好文本的流編輯器 |
sort | 用于對(duì)文本文件的行進(jìn)行排序 |
split | 用于將文件分割成塊 |
strings | 用于打印文件中可打印的字符串 |
tac | 與cat命令相反赠摇,用于倒序的顯示文件或鏈接文件 |
tail | 用于顯示文件的結(jié)尾部分 |
tee | 用于從標(biāo)準(zhǔn)輸入讀取文件內(nèi)容寫入標(biāo)準(zhǔn)輸出或文件 |
tr | 用于轉(zhuǎn)換或刪除字符 |
uniq | 用于報(bào)告或忽略重復(fù)的行 |
wc | 用于打印文件中的總行數(shù)、單詞數(shù)或字節(jié)數(shù) |
在管道中使用awk命令
顯示當(dāng)前系統(tǒng)的總內(nèi)存大小浅蚪,單位為KB
free | grep Mem | awk '{print $2}'
cut命令
cut 命令用于文本處理藕帜,你可以使用這個(gè)命令來(lái)提取文本中指定內(nèi)容。
查看系統(tǒng)登錄shell是"/bin/bash"的用戶名和對(duì)應(yīng)用戶主目錄
grep "bin/bash" /etc/passwd | cut -d: -f1,6
grep 命令
查看日志文件中的錯(cuò)誤信息
grep -i "error:" /var/log/messages | less
tar 命令
tar 命令是linux系統(tǒng)中最常用的打包文件程序
可以使用tar命令賦值一個(gè)目錄的整體結(jié)構(gòu)
tar cf - /home/larenzhang | (cd /backup/: tar xf -)
head 命令
打印命令前幾行輸出惜傲,默認(rèn)10行
ls /usr/bin | head -n 5
uniq 命令
uniq 命令用于報(bào)告或刪除重復(fù)的行洽故。
去掉輸出中重復(fù)的行
sort testfile | uniq -c | sort -nr
wc命令
用于統(tǒng)計(jì)包含在文本流中的字符數(shù)、單次數(shù)和行數(shù)
統(tǒng)計(jì)當(dāng)前登錄到系統(tǒng)的用戶數(shù)
who | wc -l