1、Shell概述
(1)Shell說明:
- Shell 就是命令解釋器,而shell Script 是利用 shell 所寫的一個程序
- 簡單理解就是將多個指令匯集在一起,然后一次執(zhí)行
- 查詢系統(tǒng)支持的 shell類型:
cd /etc/
cat shells
(2)ShellScript編寫建議
- 指令和參數(shù)之間的多個空格會被忽略
- 當(dāng)讀到回車符(enter)的時候嘗試執(zhí)行
- 當(dāng)一行的內(nèi)容過長時可以使用跳脫字符(\enter)來分行
- #是被用作注解(注釋),除 shell文件定義
- 編寫的文檔里面加上文檔的用途,歷史修改,作者等信息
(3)建議在 Script 檔案中聲明的東西
- 文檔的功能
- 文檔的版本信息,作者及其聯(lián)系
- 修改的歷史記錄
- 內(nèi)部特殊的指令
- 預(yù)設(shè)的環(huán)境變量
2、echo命令
man echo:
NAME
echo -- write arguments to the standard output
SYNOPSIS
echo [-n] [string ...]
DESCRIPTION
The echo utility writes any specified operands, separated by single blank (` ') characters and followed by a newline (`\n') character, to the standard output.
The following option is available:
-n Do not print the trailing newline character. This may also be achieved by appending `\c' to the end of the string, as is done by iBCS2 compatible systems. Note that this
option as well as the effect of `\c' are implementation-defined in IEEE Std 1003.1-2001 (``POSIX.1'') as amended by Cor. 1-2002. Applications aiming for maximum portabil-
ity are strongly encouraged to use printf(1) to suppress the newline character.
Some shells may provide a builtin echo command which is similar or identical to this utility. Most notably, the builtin echo in sh(1) does not accept the -n option. Consult the
builtin(1) manual page.
EXIT STATUS
The echo utility exits 0 on success, and >0 if an error occurs.
SEE ALSO
builtin(1), csh(1), printf(1), sh(1)
轉(zhuǎn)義說明:
\a 發(fā)出警告聲;
\b 刪除前一個字符;
\c 最后不加上換行符號;
\f 換行但光標(biāo)仍舊停留在原來的位置;
\n 換行且光標(biāo)移至行首;
\r 光標(biāo)移至行首,但不換行;
\t 插入tab;
\v 與\f相同;
\\ 插入\字符;
\nnn 插入nnn(八進制)所代表的ASCII字符;
3.shell 腳本樣例開發(fā)
創(chuàng)建文件:
(1)創(chuàng)建Shell腳本文件
vim helloShell.sh
(2)定義bashbang
#!/bin/bash
(3)腳本開發(fā)
echo hello shell
執(zhí)行方式:
- 賦予執(zhí)行權(quán)限,在相對/絕對路徑下進行執(zhí)行
chmod 755 helloShell.sh
./helloShell.sh
- 通過 bash 進行調(diào)用
bash helloShell.sh
4、Bash基本功能
(1) history
說明:
- history命令用于顯示指定數(shù)目的指令命令,讀取歷史命令文件中的目錄到歷史命令緩沖區(qū)和將歷史命令緩沖區(qū)中的目錄寫入命令文件。
- 該命令單獨使用時,僅顯示歷史命令,在命令行中,可以使用符號!執(zhí)行指定序號的歷史命令。例如,要執(zhí)行第2個歷史命令,則輸入!2;
- history more 是記錄 1000 個歷史命令,并且是在退出系統(tǒng)時進行記錄。具體的記錄位置為 用戶 home 目錄下 .bash_hostory 文件中。
語法:
history [選項] (參數(shù))
-c:清空當(dāng)前歷史命令;
-a:將歷史命令緩沖區(qū)中命令寫入歷史命令文件中;
-r:將歷史命令文件中的命令讀入當(dāng)前歷史命令緩沖區(qū);
-w:將當(dāng)前歷史命令緩沖區(qū)命令寫入歷史命令文件中。
樣例:
- history: 默認查詢1000 條歷史命令。
- history -a: 系統(tǒng)為 logout前,將緩沖區(qū)中的命令記錄寫入到.bash_history 中
(2) 命令和文件的補全
- 使用 tab 鍵進行文件和命令的補全操作。
- 輸入命令后,連續(xù)敲兩次 tab 會列出以該命令開頭的所有可用命令
(3) alias
說明:
- alias命令用來設(shè)置指令的別名。我們可以使用該命令可以將一些較長的命令進行簡化。
- 使用alias時,用戶必須使用單引號''將原來的命令引起來,防止特殊字符導(dǎo)致錯誤。
- alias命令的作用只局限于該次登入的操作。若要每次登入都能夠使用這些命令別名,則可將相應(yīng)的alias命令存放到bash的初始化文件/etc/bashrc中。
語法:
alias [選項] (參數(shù))
[選項]:
-p:打印已經(jīng)設(shè)置的命令別名。
[參數(shù)]:
格式為 命令別名=‘實際命令’ 例如: alias lt = 'ls -ltr'
樣例:
- 設(shè)置別名: alias lt = 'ls -ltr'
- 查詢設(shè)置的別名: alias -p
(4)bash 快捷鍵
| 快捷鍵 | 作用 |
|---|---|
| ctrl+c | 強制結(jié)束當(dāng)前命令 |
| Ctrl+A | 把光標(biāo)移動到命令行開頭 |
| ctrl+E | 把光標(biāo)移動到明亮行結(jié)尾 |
| Ctrl+L | 清屏 相當(dāng)于 clear |
| ctrl+U | 刪除或者剪切光標(biāo)之前的命令 |
| ctrl+K | 刪除或者剪切光標(biāo)之后的命令 |
| ctrl+Y | 粘貼 ctrl+u 或者 ctrl+K 之后的內(nèi)容 |
| ctrl+R | 在歷史命令中搜索 |
| ctrl+Z | 暫停,并放入后臺 |
| ctrl+S | 暫停屏幕輸出 |
| Ctrl+Q | 恢復(fù)屏幕輸出 |
(5)、輸入輸出重定向
1) Bash的標(biāo)準(zhǔn)輸入輸出
| 操作設(shè)備 | 設(shè)備文件名 | 文件描述符 | 類型 |
|---|---|---|---|
| 鍵盤 | /dev/stdin | 0 | 標(biāo)準(zhǔn)輸入 |
| 顯示器 | / dev/stout | 1 | 標(biāo)準(zhǔn)輸出 |
| 顯示器 | /dev/sterr | 2 | 標(biāo)準(zhǔn)錯處輸出 |
2) 輸出重定向

輸出重定向
3)輸入重定向
說明:
- < 改變標(biāo)準(zhǔn)輸入路徑,使用文件作為數(shù)據(jù)源
- << 改變標(biāo)準(zhǔn)輸入路徑,使用輸入作為數(shù)據(jù)源,需要一個結(jié)束符
wc [選項] [文件名]
選項
-c 統(tǒng)計字節(jié)數(shù)
-w 統(tǒng)計單詞數(shù)
-l 統(tǒng)計行數(shù)
(6)多命令順序執(zhí)行
說明:
| 執(zhí)行符 | 格式 | 作用 |
|---|---|---|
| ; | cmdA ;cmdB ; cmdC | 多個命令順序執(zhí)行,每個命令之間沒有聯(lián)系 |
| && | cmdA && cmdB | 當(dāng) cmdA 成功執(zhí)行結(jié)束后,執(zhí)行 cmdB;當(dāng) cmdA執(zhí)行異常是,不會執(zhí)行 cmdB |
| | | cmdA || cmdB | 當(dāng) cmdA 執(zhí)行異常時,cmdB才會執(zhí)行;當(dāng) cmdA執(zhí)行正常時,cmdB不會執(zhí)行 |
樣例:
單分支if:如果ls執(zhí)行成功輸出yes,執(zhí)行失敗輸出no
ls && echo yes || echo no
(7)管道符
1)行提取命令 grep
說明:
grep [選項] "搜索內(nèi)容" 文件名
[選項]:
-A 數(shù)字 列出符合條件的行,并列出后續(xù)的n行
-B 數(shù)字 列出符合條件的行,并列出前面的n行
-c 統(tǒng)計符合條件的字符串的次數(shù)
-i 忽略大小寫
-n 輸出行號
-v 反向查找
--color=auto 搜索出的關(guān)鍵字用顏色顯示
樣例:
- grep ls .bash_history
- grep -A 3 "ls" .bash_history
- grep --color=auto -A 3 "ls" .bash_history
- grep -c "ls" .bash_history
2)搜索命令 find
用途: 在指定目錄下查找文件
說明:
find path -option [-print] [-exec -ok |xargs |grep] [command {} \;]
path:要查找的目錄路徑
~ 表示$HOME目錄
. 表示當(dāng)前目錄
/ 表示根目錄
-option:查找方式
-name filename #查找名為filename的文件
-perm #按執(zhí)行權(quán)限來查找
-user username #按文件屬主來查找
-group groupname #按組來查找
-mtime -n +n #按文件更改時間來查找,-n指n天以內(nèi),+n指n天以前
-atime -n +n #按文件訪問時間來查找文件,-n指n天以內(nèi),+n指n天以前
-ctime -n +n #按文件創(chuàng)建時間來查找文件,-n指n天以內(nèi),+n指n天以前
-nogroup #查無有效屬組的文件
-nouser #查無有效屬主的文件,即文件的屬主在/etc/passwd中不存
-type b/d/c/p/l/f #查是塊設(shè)備、目錄、字符設(shè)備、管道、符號鏈接、普通文件
-size n[c] #查長度為n塊[或n字節(jié)]的文件
-mount #查文件時不跨越文件系統(tǒng)mount點
-follow #如果遇到符號鏈接文件,就跟蹤鏈接所指的文件
-prune #忽略某個目錄
[-print] : 將結(jié)果作為標(biāo)準(zhǔn)輸出
[-exec]: 對匹配到的文件執(zhí)行shell命令
[-ok]: 對匹配到的文件執(zhí)行 Shell 命令,執(zhí)行之前會進行確認
樣例:
- find . -name '*.txt' -print:當(dāng)前目錄查找txt結(jié)尾的文件
- find . -path "./testDir" -prune -o -name "*.txt" -print : 在當(dāng)前目錄除testDir之外的子目錄內(nèi)搜索txt結(jié)尾的文件
- find . -perm 755 -print: 在當(dāng)前目錄中查詢具有執(zhí)行權(quán)限的文件
-
find . -size -39k: 查找當(dāng)前目錄下,大小為 39K的文件
執(zhí)行命令: - find . -name '*.txt' -exec echo "ok" {} ; :查找以txt結(jié)尾的文件,找到之后輸出ok;
- find . -name 'test.txt' -ok cp {} {}.bak ; :備份test.txt
3)find 與 grep的區(qū)別
- find是在系統(tǒng)當(dāng)中搜索符合條件的文件名,如果需要模糊查詢,使用通配符或者正則進行匹配。
- grep命令是在文件中搜索符合條件的字符串,如果需要模糊查詢,則可使用正則進行匹配。
(8)通配符
| 通配符 | 說明 | 樣例 |
|---|---|---|
| * | 匹配0個或多個任意字符 | a*b,a與b之間可以有任意長度的字符,也可以沒有。 |
| ? | 匹配一個任意字符 | a?b,a與b之間必須但也只能存在一個字符,該字符可以是任意字符 |
| [] | 匹配[]中的任意單個字符 | a[xyz]b,a與b之間必須但也只能存在一個字符,該字符只能是x或y或z |
| [! ] | 匹配除list中的任意單個字符 | a[!a-z]b,a與b之間必須但也只能存在一個字符,該字符不能是小寫字母 |
| [c1-c2] | 匹配c1-c2間的任意單個字符 | a[0-1]b,a與b之間必須但也只能存在一個字符,該字符只能是數(shù)字 |
| {} | 匹配{} 中的一個字符串 | a{abc,xyz,opq}b,a與b之間必須但也只能存在一個字符串,字符串只能是abc或xyz或opq |
(9)特殊字符
1) 說明
| 符號 | 作用 |
|---|---|
| '' | 單引號,被單引號包含的所有特殊字符都沒有特殊含義 |
| "" | 雙引號,在雙引號內(nèi)的特殊符號是沒有特殊含義的,但是$,`, \例外 |
| `` | 反引號,反引號括起來的就是系統(tǒng)命令 |
| $() | 引用系統(tǒng)命令 |
| () | 用于一串命令執(zhí)行時,回去子shell中執(zhí)行 |
| {} | 異常命令執(zhí)行時,{}中的命令會在當(dāng)前 Shell 中執(zhí)行 |
| [] | 用于變量測試 |
| # | 在 Shell 中,除BashBang 之外,其他情況下均代表注釋 |
| $ | 用于調(diào)用變量的值 |
| \ | 轉(zhuǎn)義符 |
2)$()和 ` `(反引號)
- bash shell 中,$( ) 與
(反引號) 都可用做命令替換用。 - `` 基本上可用在全部的 unix shell 中使用,若寫成 shell script ,其移植性比較高,但反單引號容易打錯或看錯
- 在部分編輯器中反引號與單引號相似,容易出現(xiàn)混淆,建議使用${}進行系統(tǒng)命令引用