目錄
- 1、shell的概述
- 2、腳本的調(diào)用形式
- 3、shell語法初識
- 4、變量
- 5、預(yù)設(shè)變量
- 6、變量的擴(kuò)展
- 7、條件測試
- 8、控制語句
- 9、函數(shù)
1、shell的概述
shell 是一種腳本語言
腳本:本質(zhì)是一個(gè)文件,文件里面存放的是 特定格式的指令,系統(tǒng)可以使用腳本解析器 翻譯或解析 指令 并執(zhí)行(它不需要編譯)
shell 既是應(yīng)用程序 又是一種腳本語言(應(yīng)用程序 解析 腳本語言)
shell命令解析器:
系統(tǒng)提供 shell命令解析器: sh ash bash
查看自己linux系統(tǒng)的默認(rèn)解析:echo $SHELL
![](/d/20211017/a7da9c834e0a53310f6c0406ca610a6f.gif)
![](/d/20211017/f43660a6030b1f4d9f040ea6374e51e2.gif)
![](/d/20211017/b6d9a7c65fb89259751929854f9cc560.gif)
shell腳本是一種腳本語言,我們只需使用任意文本編輯器,按照語法編寫相應(yīng)程序,增加可執(zhí)行權(quán)限,即可在安裝shell命令解釋器的環(huán)境下執(zhí)行
2、腳本的調(diào)用形式
打開終端時(shí)系統(tǒng)自動(dòng)調(diào)用:/etc/profile 或 ~/.bashrc
/etc/profile
此文件為系統(tǒng)的每個(gè)用戶設(shè)置環(huán)境信息,當(dāng)用戶第一次登錄時(shí),該文件被執(zhí)行,系統(tǒng)的公共環(huán)境變量在這里設(shè)置
開始自啟動(dòng)的程序,一般也在這里設(shè)置
~/.bashrc
用戶自己的家目錄中的.bashrc
登錄時(shí)會自動(dòng)調(diào)用,打開任意終端時(shí)也會自動(dòng)調(diào)用
這個(gè)文件一般設(shè)置與個(gè)人用戶有關(guān)的環(huán)境變量,如交叉編譯器的路徑等等
用戶手動(dòng)調(diào)用:用戶實(shí)現(xiàn)的腳本
![](/d/20211017/15300fa689b45f46fdd20cc6996b09df.gif)
3、shell語法初識
3.1、定義以開頭:#!/bin/bash
#!用來聲明腳本由什么shell解釋,否則使用默認(rèn)shell
![](/d/20211017/6ec9cfc019d9ffb95f822d2c26c9ed07.gif)
3.2、單個(gè)"#"號代表注釋當(dāng)前行第一步:編寫腳本文件
![](/d/20211017/83802490e61e9969a6088a3455c4e7f5.gif)
第二步:加上可執(zhí)行權(quán)限
![](/d/20211017/fe658ebe8cac7b90e5a762cb767befe3.gif)
第三步:運(yùn)行
![](/d/20211017/f8621b858ebfd93eaddda3e5d0829cde.gif)
三種執(zhí)行方式 (./xxx.sh bash xxx.sh . xxx.sh)
三種執(zhí)行方式的不同點(diǎn)(./xxx.sh bash xxx.sh . xxx.sh)
./xxx.sh :先按照 文件中#!指定的解析器解析
如果#!指定指定的解析器不存在 才會使用系統(tǒng)默認(rèn)的解析器
bash xxx.sh:指明先用bash解析器解析
如果bash不存在 才會使用默認(rèn)解析器
. xxx.sh 直接使用默認(rèn)解析器解析
三種執(zhí)行情況:(重要)
![](/d/20211017/42e3e389a899f5851f28cbe1db426111.gif)
注意:windows下 寫腳本 在linux下執(zhí)行 注意
![](/d/20211017/3fb516e37474b9f33dc90b0973777dd8.gif)
執(zhí)行結(jié)果:
![](/d/20211017/5591ae0fa596cba229377e033a59bdb4.gif)
將windows文件 轉(zhuǎn)換成 unix文件
方法一:dos2unix 如果沒有該插件 需要安裝
sudo apt-get install dos2unix
dos2unix shell腳本
轉(zhuǎn)換成功就可以執(zhí)行運(yùn)行
方法二:
需要用vi打開腳本,在最后一行模式下執(zhí)行
:set ff=unix
![](/d/20211017/2a16e1be529c7aa3399f8884e52e872b.gif)
4、變量
定義變量
變量名=變量值
如:num=10
引用變量
$變量名
unset :清除變量值
![](/d/20211017/c24c5a7d394d338cbcb7cb27b38bb9f3.gif)
運(yùn)行結(jié)果:
![](/d/20211017/72eb43ce0e28c960372b71aaf9e19bc1.gif)
從鍵盤獲取值read
![](/d/20211017/5020a2c3a33013f166bf60363f21e17d.gif)
運(yùn)行結(jié)果:
![](/d/20211017/44a593ca3527283bfe633f500ec20f28.gif)
案例:
在一行上顯示和添加提示 需要加上-p
![](/d/20211017/574faf84331edfc54591c09b4e517a88.gif)
運(yùn)行結(jié)果:
![](/d/20211017/74b6ab01d95bb8ba0cd36544c4b752f6.gif)
案例:讀取多個(gè)值
![](/d/20211017/233f91b3ff8e62be061f7970e182e458.gif)
運(yùn)行結(jié)果:
![](/d/20211017/ccc09d08f7f8ae1bfd61b8d7c5f9759e.gif)
案例只讀變量:
![](/d/20211017/52a0e5acbbf9ae5741c8bc888edf29b6.gif)
運(yùn)行結(jié)果:
![](/d/20211017/d5e0a876dd10794c447c844205eb5f55.gif)
查看環(huán)境變量:env
![](/d/20211017/ab71c61e1cad695116a3638ed6c29764.gif)
![](/d/20211017/469f9d9976d3b7c55248f49e34d77bf3.gif)
導(dǎo)出環(huán)境變量(其他shell識別該變量)
source 腳本文件
source命令用法:
source FileName
作用:在當(dāng)前bash環(huán)境下讀取并執(zhí)行FileName中的命令。
注:該命令通常用命令“.”來替代。
如:source .bash_rc 與 . .bash_rc 是等效的。
注意:source命令與shell scripts的區(qū)別是,
source在當(dāng)前bash環(huán)境下執(zhí)行命令,而scripts是啟動(dòng)一個(gè)子shell來執(zhí)行命令。這樣如果把設(shè)置環(huán)境變量(或alias等等)的命令寫進(jìn)scripts中,就只會影響子shell,無法改變當(dāng)前的BASH,所以通過文件(命令列)設(shè)置環(huán)境變量時(shí),要用source 命令。
![](/d/20211017/3094677c88d711405fd8628a5be1ec40.gif)
![](/d/20211017/5cd93b95b14c72b8b9e10f69773939b6.gif)
可以在終端中讀取:
![](/d/20211017/c9d5f3e6e8446b6af78910a96a8f2ce0.gif)
在其他sh腳本讀?。?br />
![](/d/20211017/7bd080c1c490e57e8629da0e6342ae01.gif)
運(yùn)行結(jié)果:
![](/d/20211017/14efef571c2cf2916d003b559585af85.gif)
注意事項(xiàng):
1、變量名只能包含英文字母下劃線,不能以數(shù)字開頭
1_num=10 錯(cuò)誤
num_1=20 正確
2、等號兩邊不能直接接空格符,若變量中本身就包含了空格,則整個(gè)字符串都要用雙引號、或單引號括起來
3、雙引號 單引號的區(qū)別
雙引號:可以解析變量的值
單引號:不能解析變量的值
![](/d/20211017/b79b39e4f3a77178cde37fd5f9866890.gif)
運(yùn)行結(jié)果:
![](/d/20211017/200ef1674e49ff23767425e66b146d36.gif)
如果想在PATH變量中 追加一個(gè)路徑寫法如下:(重要!?。。。?/p>
export PATH=$PATH:/需要添加的路徑
5、預(yù)設(shè)變量
shell直接提供無需定義的變量
![](/d/20211017/fc6d247e497c845f8243a62fa1793b3a.gif)
案例:
![](/d/20211017/1827ec8ac9b30afdd5071f90fac93b49.gif)
運(yùn)行結(jié)果:
![](/d/20211017/2b07dc54f30447b498411aca6cd63088.gif)
腳本標(biāo)量的特殊用法
![](/d/20211017/3f6e13a88948954d624ad1b91e8bc5c3.gif)
![](/d/20211017/34b2c6f7245320bf9055bca10cb8a404.gif)
![](/d/20211017/5a90f466b054d5814f1dc2635a9ae62b.gif)
加-e轉(zhuǎn)義 才起換行作用
![](/d/20211017/30d7dde89b827d2833a27808b084dd79.gif)
()由子shell 完成
![](/d/20211017/3c3832f6ea484e089e70231f8625e2db.gif)
{}由當(dāng)前的shell執(zhí)行
![](/d/20211017/dc782f8fbcc7e1f5ef55ea221bbc7ab7.gif)
6、變量的擴(kuò)展
6.1、判斷變量是否存在
![](/d/20211017/46ce7bcc02565890c4672daf99c23b69.gif)
![](/d/20211017/8abd50c25c4fb0fc06d4079078885d62.gif)
6.2、字符串的操作
![](/d/20211017/014b113042569cf067875af382b9a197.gif)
7、條件測試
test命令:用于測試字符串、文件狀態(tài)和數(shù)字
test命令有兩種格式:
test condition 或[ condition ]
使用方括號時(shí),要注意在條件兩邊加上空格。
7.1、文件測試
![](/d/20211017/f758d36ed7806fb41300166c1d4a01e7.gif)
![](/d/20211017/ed95723c97b000fc77bc51eb4b44671f.gif)
7.2、字符串測試
![](/d/20211017/47f13ac09c12b67cf1f34cb7bba4d824.gif)
![](/d/20211017/d13868959ba5a69170586cfe2cc9c45e.gif)
![](/d/20211017/bfe11842d8d64416bc61f22b91d7c9c3.gif)
7.3、數(shù)值測試
![](/d/20211017/86710828a67127bb320fd7dc9f225846.gif)
![](/d/20211017/f5435ec8283da4415fe566443fd94b56.gif)
![](/d/20211017/379db9f36d34e3912878ae13a49ab65d.gif)
7.4、符合語句測試
![](/d/20211017/14c436d2af2c1e5ba414a2c2cb2eb65c.gif)
![](/d/20211017/12870648823a1fa5d0b164ef8486871e.gif)
8、控制語句
![](/d/20211017/74c822caf13dc7e586bbec48e80285ee.gif)
8.1、if控制語句
格式一:
if [條件1]; then
執(zhí)行第一段程序
else
執(zhí)行第二段程序
fi
格式二:
if [條件1]; then
執(zhí)行第一段程序
elif [條件2];then
執(zhí)行第二段程序
else
執(zhí)行第三段程序
fi
案例:
![](/d/20211017/38f523eed13be46369e1292fbe069a8b.gif)
案例:判斷當(dāng)前路徑下有沒有文件夾 有就進(jìn)入創(chuàng)建文件 沒有 就創(chuàng)建文件夾 再進(jìn)入創(chuàng)建文件
![](/d/20211017/bfa396728a80bda27e13e43fe4f23349.gif)
運(yùn)行結(jié)果:
![](/d/20211017/6e41566126d44ec543bc09fdf392a7aa.gif)
案例:
![](/d/20211017/9ba223ad670bc445d91d5bc3d79a23d9.gif)
運(yùn)行結(jié)果:
![](/d/20211017/efe1752e5ddd96f0b834045ef88a23aa.gif)
8.2、case
![](/d/20211017/de058bb63b0e4f9974ff31b280c04376.gif)
![](/d/20211017/9de5e6644bd4ed9361fac27548d3696f.gif)
8.3、for循環(huán)語句
![](/d/20211017/3c81c717377664534cb6cbbebe6dc739.gif)
![](/d/20211017/3360999c1667eb3310bae6e472598e83.gif)
![](/d/20211017/6edf468f7132ca40c686174db78062f0.gif)
案例:
![](/d/20211017/3ebc2c0a096d3194db30262cb4a41193.gif)
案例:掃描當(dāng)前文件
![](/d/20211017/ff0ed61ffacc5b236fcce3f38d28b5e9.gif)
8.4、while
![](/d/20211017/034c28abc73afbb9faf9299d9407eb3c.gif)
![](/d/20211017/99c9379f1ab7447f28c96bcd514301a7.gif)
8.5、until
![](/d/20211017/760257f5257bfeff6eb21cc1c91f30bb.gif)
![](/d/20211017/612aeacb8cfaa56f92665aa2ba434fac.gif)
8.6、break continue
![](/d/20211017/c6f0c921adf2cf13cab9475580d34393.gif)
9、函數(shù)
![](/d/20211017/7554e72e66b00116c5202b359fbedde5.gif)
所有函數(shù)在使用前必須定義,必須將函數(shù)放在腳本開始部分,直至shell解釋器首次發(fā)現(xiàn)它時(shí),才可以使用
![](/d/20211017/9a2063ba1ac75902251e88c0ff1e60ef.gif)
案例:求最值
![](/d/20211017/5c523dac590b558b8604fc1d15238e22.gif)
案例:函數(shù)分文件
![](/d/20211017/7d43bd8c4ed80497908e4dfa40853182.gif)
fun.sh
![](/d/20211017/302ea2e295b8acabfdc2634b0b813d3b.gif)
24_sh.sh
![](/d/20211017/e54b86bec46085d87cfcd57904c8409d.gif)
到此這篇關(guān)于shell腳本語言的使用(超全超詳細(xì))的文章就介紹到這了,更多相關(guān)shell腳本語言內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Linux Shell腳本系列教程(二):終端打印命令詳解
- Linux shell傳遞參數(shù)實(shí)現(xiàn)原理及代碼實(shí)例
- shell腳本4種執(zhí)行方式
- linux反彈shell的原理詳解
- 自己常用的一些shell腳本分享
- 入門shell腳本基礎(chǔ)及原理