- Shell是一個命令行解釋器孵奶,實現(xiàn)命令和機(jī)器碼互轉(zhuǎn)
- Shell是一門編程語言鞋真,是一種解釋執(zhí)行的腳本語言
分類
- Bourne Shell
- sh
- ksh
- Bash
- psh
- zsh
- C Shell
- csh
- tcsh
- /etc/shells 查看支持的shell
Bash操作
-
bash
進(jìn)入bash -
exit
退出bash -
\
命令換行 - 歷史命令
- 上下箭頭調(diào)出歷史命令
- 單擊Tab鍵補(bǔ)全,雙擊Tab鍵列出所有相似
- ![num] 重復(fù)執(zhí)行第num條命令
- !! 重復(fù)執(zhí)行上一條
- 快捷鍵
- 快捷鍵傳送門
- ctrl+c 中斷
- ctrl+l 清屏竿秆,clear命令清屏
- ctrl+u 剪切光標(biāo)之前的命令
- ctrl+y 粘貼
- ctrl+r 歷史命令中搜索
- ctrl+d 結(jié)束符障癌,退出當(dāng)前終端
- ctrl+a 移到行首
- ctrl+e 移到行尾
- ctrl+z 暫定框舔,放入后臺
- ctrl+s 暫停屏幕輸出
- ctrl+q 恢復(fù)屏幕輸出
腳本基礎(chǔ)
- 文件后綴
.sh
- 文件頭
#!/bin/bash
-
#
注釋 - 執(zhí)行腳本
- bash xxx.sh
- 賦予權(quán)限執(zhí)行
- chmod 755 xxx.sh
- ./xxx.sh
標(biāo)準(zhǔn)輸入輸出
設(shè)備 | 設(shè)備文件名 | 文件描述符 | 類型 |
---|---|---|---|
鍵盤 | /dev/stdin | 0 | 標(biāo)準(zhǔn)輸入 |
顯示器 | /dev/stdout | 1 | 標(biāo)準(zhǔn)輸出 |
顯示器 | /dev/stderr | 2 | 標(biāo)準(zhǔn)錯誤輸出 |
- 輸出重定向
- [命令] >[文件] 保存正確結(jié)果意荤,覆蓋模式
- [命令] >>[文件] 保存正確結(jié)果啊片,追加模式
- [命令] 2>[文件] 保存錯誤信息,覆蓋模式
- [命令] 2>>[文件] 保存錯誤信息玖像,追加模式
- [命令] > [文件] 2>&1 保存正確和錯誤紫谷,覆蓋模式
- [命令] >> [文件] 2>&1 保存正確和錯誤,追加模式
- [命令] &>[文件] 保存正確和錯誤捐寥,覆蓋模式
- [命令] &>>[文件] 保存正確和錯誤碴里,追加模式
- [命令] >> [文件1] 2>>[文件2] 正確追加到文件1,錯誤追加到文件2
- 輸入重定向
- wc < [文件名]
- 把文件作為命令輸入
- wc < [文件名]
多命令
-
;
連接多個命令 -
&&
邏輯與上真,命令1成功,執(zhí)行命令2 -
||
邏輯或羹膳,命令1失敗睡互,執(zhí)行命令2 -
|
管道符,命令1的正確輸出作為命令2的操作對象- ll /etc | more
- netstat -an | grep [keywords]
-
&
任務(wù)在后臺執(zhí)行
通配符和特殊字符
- 通配符
-
?
一個任意字符 -
*
0或多個任意字符 -
[]
中括號中任意一個字符 -
[-]
中括號中任意一個字符陵像,-
代表范圍 -
[^]
不是中括號中的字符
-
- 特殊字符
-
''
單引號中所有特殊字符都沒有特殊含義就珠,原樣輸出 -
""
雙引號中所有特殊字符都沒有特殊含義- 但是以下除外
-
$
調(diào)用變量的值 - ` 反引號,引用命令
-
\
轉(zhuǎn)義符
-
$()
引用系統(tǒng)命令 - `` 反引號擴(kuò)起來的內(nèi)容是系統(tǒng)命令醒颖,和
$()
作用一樣 -
#
代表注釋 -
&
后臺執(zhí)行- find / -name xxx.sh &
-
\
轉(zhuǎn)義字符妻怎,在\之后的特殊符號將時區(qū)特殊含義,變?yōu)槠胀ㄗ址?/li>
-
命令
- echo [內(nèi)容]
- 輸出字符
- -e 轉(zhuǎn)義字符
- \ 輸出\
- \a 警告音
- \b 退格鍵
- \c 取消行末換行符
- \e escape鍵
- echo -e "\e[1;31m abcd \e[0m"
- 30m 黑色
- 31m 紅色
- 32m 綠色
- 33m 黃色
- 34m 藍(lán)色
- 35m 洋紅
- 36m 青色
- 37m 白色
- echo -e "\e[1;31m abcd \e[0m"
- \f 換頁
- \n 換行
- \r 回車鍵
- \t 制表符泞歉,tab鍵
- \v 垂直制表符
- \0nnn 八進(jìn)制ASCII碼
- \xhh 十六進(jìn)制ASCII碼
- echo -e "a\tb\tc"
- dos2unix [文件]
- windows編碼轉(zhuǎn)換為Linux編碼
- 2 two to
- 4 four for
- history
- 查看歷史命令
- 默認(rèn)保存1000條逼侦,/etc/profile,HISTSIZE
- -c 清空歷史命令
- -w 把緩存中的歷史命令寫入歷史命令保存文件
- ~/.bash_history
- 查看歷史命令
- alias
- 查看別名
- alias [別名]=[command]
- 設(shè)置別名腰耙,臨時生效
- /root/.bashrc
- unalias [別名]
- 刪除別名
變量
- 分類
- 用戶自定義變量/本地變量
- 環(huán)境變量榛丢,系統(tǒng)操作環(huán)境相關(guān)的數(shù)據(jù)
- 環(huán)境變量建議大寫
- 位置參數(shù)變量,腳本參數(shù)
- 預(yù)定義變量
- 用戶自定義變量/本地變量
- 聲明賦值
- [變量名]=[變量值]
- name=zhangsan
- name="zhang san"
- name="$date"
- name=$(date)
- 連接
- info=hello"$name"
- info=hello${name}
- 調(diào)用
- $name
- 查看所有變量
- set
- 刪除
- unset name
- 聲明賦值
- 環(huán)境變量
- 聲明賦值
- export [變量名]=[變量值]
- export [本地變量]
- 查詢
- env
- 調(diào)用
- $[變量名]
- 刪除
- unset [變量名]
- 常見環(huán)境變量
- PATH
- 系統(tǒng)查找命令的路徑
- echo $PATH
- PATH="$PATH":/xxx 追加
- PS1
- 系統(tǒng)提示符格式
[root@localhost ~]#
- $ root提示#挺庞,普通用戶提示$
- echo $PS1
- 系統(tǒng)提示符格式
- PATH
- 聲明賦值
- 位置參數(shù)變量
-
$n
命令行參數(shù)傳遞給腳本-
$0
命令本身 -
$1-$9
第1到9個參數(shù) -
${10}
10個以上參數(shù) - bash xxx.sh zhangsan 18
-
$0
xxx.sh -
$1
zhangsan -
$2
18
-
-
-
$*
所有參數(shù)晰赞,一個字符 -
$@
所有參數(shù),字符數(shù)組 -
$#
參數(shù)個數(shù)
-
- 預(yù)定義變量
- $? 最后一次執(zhí)行命令的返回狀態(tài)
- 0 執(zhí)行正確
- 非0 執(zhí)行不正確
- $$ 當(dāng)前進(jìn)程的PID
- $! 最后一個后臺進(jìn)程的PID
- $? 最后一次執(zhí)行命令的返回狀態(tài)
- read [變量名]
- 接受鍵盤輸入
- -p [提示信息] 提示信息
- -t [描述] 等待用戶輸入,等待時間
- -n [字符數(shù)] 只接受指定字符數(shù)
- -s 隱藏輸入的數(shù)據(jù)
數(shù)值運算與運算符
- declare [+/-][選項] [變量名]
- 聲明變量類型
-
-
為變量設(shè)定類型屬性 -
+
取消變量的類型屬性 - -i 整型
- -x 環(huán)境變量
- -p 顯示變量的類型
- declare -p [變量名]
- 數(shù)值運算
#! /bin/bash
num1=$1
num2=$2
declare -i sum=$num1+$num2
echo "方式一:$sum"
echo "方式二:$(expr $num1 + $num2)"
echo "方式三:$(($num1+$num2))"
echo "方式三:$[$num1+$num2]"
- 運算符
+ - * / % && ||
環(huán)境變量配置文件
- source [配置文件]
- 使配置文件生效掖鱼,另一種寫法
. [配置文件]
- 使配置文件生效掖鱼,另一種寫法
- 配置文件
- 所有用戶生效
- /etc/profile
- USER
- LOGNAME
- PATH
- HOSTNAME
- HISTSIZE
- umask
- 調(diào)用/etc/profile.d/*.sh
- /etc/profile.d/*.sh
- /etc/bashrc
- PS1
- umask
- PATH
- 調(diào)用/etc/profile.d/*.sh
- /etc/profile
- 只對用戶生效
- ~/.bash_profile
- 調(diào)用~/.bashrc
- ~/.bashrc
- ~/.bash_profile
- 用戶登錄時讀取順序
- /etc/profile
- /etc/profile.d/*.sh
- ~/.bash_profile
- ~/.bashrc
- /etc/bashrc
- /etc/profile
- ~/.bash_logout
- 注銷時讀取
- ~/.bash_history
- 命令歷史
- /etc/issue
- 本地終端歡迎信息
- /etc/issue.net
- 遠(yuǎn)程終端歡迎信息
- /etc/motd
- 登錄后歡迎信息
- 所有用戶生效
正則表達(dá)式
- 在文件中匹配符合條件的字符串
-
grep
awk
sed
支持正則表達(dá)式
-
-
*
前一個字符匹配0次或任意多次 -
.
匹配除了換行符外任意一個字符 -
^
匹配行首 -
$
匹配行尾 -
[]
匹配中括號中任意一個字符 -
[^]
匹配中括號字符意外的任意一個字符 -
\
轉(zhuǎn)義符 -
{n}
前面的字符出現(xiàn)n次 -
{n,}
前面的字符至少出現(xiàn)n次 -
{n,m}
前面的字符至少出現(xiàn)n次然走,最多出現(xiàn)m次
字符處理
- cut [文件名]
- 列提取
- -f [第幾列,..] 獲取列信息
- -d [分隔符] 指定分隔符,默認(rèn)制表符
- cut -f 1 -d : /etc/passwd
- printf '[輸出格式][輸出類型]' [輸出內(nèi)容]
- 格式化輸出
- 類型
- $ns 字符串
- %ni 整數(shù)
- %m.nf 小數(shù)
- %8.2 輸出8位戏挡,6位整數(shù)芍瑞,2位小數(shù)
- 格式
- \a 警告音
- \b 退格鍵
- \f 清屏
- \n 換行
- \r 回車
- \t 水平制表符
- \v 垂直制表符
- printf '%s %s\n' 1 2 3 4 5 6
- awk [選項] '條件{動作}...' [文件名]
- 文本分析工具
- 選項
- -F[分隔符] 指定分隔符
- 條件
- 關(guān)系表達(dá)式
- 動作
- 格式化輸出
- 流程控制語句
-
df -h | awk '{print $1 "\t" $3}'
- print 輸出,行尾換行
- 打印第一列和第三列信息
- sed [選項] '[動作]' [文件名]
- 流編輯器增拥,對數(shù)據(jù)進(jìn)行選取啄巧、替換、刪除掌栅、新增
- 選項
- -n 將sed處理的結(jié)果輸出到屏幕
- -e 允許對輸入數(shù)據(jù)進(jìn)行多條sed命令編輯秩仆,用
;
分隔 - -i sed修改的結(jié)果保存到文件,默認(rèn)不會修改文件猾封,修改的是輸出
- 動作
- a [數(shù)據(jù)] \ 追加澄耍,除最后一行,每行用\結(jié)尾
- c [數(shù)據(jù)] \ 行替換晌缘,除最后一行齐莲,每行用\結(jié)尾
- i [數(shù)據(jù)] \ 插入,除最后一行磷箕,每行用\結(jié)尾
- d 刪除
- p 打印
- s/[舊字符串]/[新字符串]/g 字符串替換
- sed -n '2p' xxx
- 輸出第2行
- sed '2,4d' xxx
- 刪除第2到4行
- sed '2a hello ' xxx
- 第二行追加hello
- sort [文件名]
- 排序
- -f 忽略大小寫
- -n 以數(shù)值型進(jìn)行排序选酗,默認(rèn)使用字符串型排序
- -r 反向排序
- -t [分隔符] 指定分隔符,默認(rèn)是制表符
- -k [n,m] 指定字段排序岳枷,-k [2,2] 指定第二個字段排序
- wc [文件名]
- -c 統(tǒng)計字節(jié)數(shù)
- -w 統(tǒng)計單詞數(shù)
- -l 統(tǒng)計行數(shù)
條件判斷
- 文件類型
- -d 文件是否存在芒填,存在且為目錄,則真
- -e 文件是否存在
- -f 文件是否存在空繁,存在且為普通文件殿衰,則真
- -L 文件是否存在,存在且為符號鏈接文件盛泡,則真
- 文件權(quán)限
- -r 文件是否存在闷祥,存在且有讀權(quán)限,則真
- -w 文件是否存在傲诵,存在且有寫權(quán)限凯砍,則真
- -x 文件是否存在,存在且有執(zhí)行權(quán)限掰吕,則真
- 文件間比較
- [文件1] -nt [文件2] 文件1修改時間是否比文件2新
- [文件1] -ot [文件2] 文件1修改時間是否比文件2舊
- [文件1] -ef [文件2] 文件1是否和文件2的inode一致果覆,是否為同一文件
- 兩個整數(shù)之間比較
- num1 -eq num2 等于
- num1 -ne num2 不等于
- num1 -gt num2 大于
- num1 -lt num2 小于
- num1 -ge num2 大于等于
- num1 -le num2 小于等于
- 字符串判斷
- -z 字符串 是否為空
- -n 字符串 是否非空
- str1 == str2
- str1 != str2
- 檢查條件
-
test -f 文件
或[-f 文件]
-
流程控制
- 單分支if條件語句
if [ 條件判斷 ];then
...
fi
if [ 條件判斷 ]
then
...
fi
- 多分支if條件語句
if [ 條件判斷 ]
then
...
elif [ 條件判斷 ]
then
...
else
...
fi
-
exit
- 退出腳本
- exit [num]
-
多分枝case條件語句
- 只能判斷一種條件
case $變量 in
"值")
...
;;
"值")
...
;;
*)
...
;;
esac
- for循環(huán)
for 變量 in 值1 值2...
do
...
done
for ((i=1;i<=100;i=i+1))
do
...
done
- while循環(huán)
- 不定循環(huán),條件成立則循環(huán)
while [ 條件判斷 ]
do
...
done
- until循環(huán)
- 不定循環(huán)殖熟,條件不成立則循環(huán)
while [ 條件判斷 ]
do
...
done
實例
- 遠(yuǎn)程下載文件輸出內(nèi)容到屏幕
#!/bin/bash
if [ ! -d "./downloads/" ];then
mkdir downloads
fi
cd downloads
wget http://xxx.com/xxx.zip
echo 下載完成
unzip xxx.zip
echo 解壓完成
rm -f xxx.zip
content=$(cat xxx.txt)
echo ===輸出開始===
echo -e "\e[1;32m$content\e[0m"
echo ===輸出結(jié)束===
rm -f xxx.txt