什么是shell腳本
- shell腳本是文本的一種
- shell腳本是可以運行的文本
- shell腳本的內容是由邏輯和數據組成
- shell腳本是解釋型語言
用file命令可以查看文件是否是一個腳本文件
file filename
腳本書寫規范
注釋
單行注釋
使用#號來進行單行注釋
多行注釋
使用
: "
注釋內容
注釋內容
注釋內容
"
注意:冒號后面有空格
注意
在.vimrc里面注釋行時
用的是"
vim用于書寫腳本的設定
ts:tab鍵的大小
sw:縮進大小
ai:自動縮進
et:將tab鍵補齊的大空格拆分成小空格
注:當你規定了tab鍵的大小時,再規定sw的縮進大小將不生效
用vim編輯這個配置文件?
vim ~/.vimrc
自動添加新創建的特定文件的預定內容
也是編寫這個配置文件
vim ~/.vimrc
如下代碼塊
?第一行的意思是當新創建一個以.sh或.script時自動執行下面我們自己寫的一個SHELLTITLE函數
其中函數中寫的是
在第1行(linux中行數從0開始計算,所以代碼中寫的是0而不是1)添加上“hahahahahahahahaha”這行內容
在第2行添加上日期,其格式為年/月/日
autocmd BufNewFile *.sh,*.script call SHELLTITLE()
func SHELLTITLE()call append(0,"hahahahahahahahaha")call append(1,"# Date: ".strftime("%Y/%m/%d"))
endfunc
檢驗效果
以.sh結尾的新文件會自動添加
以.script結尾的新文件
也會自動添加
如果不是以.sh或.script結尾的新文件
也是不會自動添加的
腳本執行方法
創建了一個新腳本文件
里面編寫的內容
注:沒有可執行權限
在沒有可執行權限時
. 腳本
. 腳本
source 腳本
source 腳本
sh 腳本
sh 腳本
?
當有可執行權限時
./腳本
./腳本
?
直接執行腳本的絕對路徑
腳本的絕對路徑
腳本調試
寫一個手殘腳本
其中cat處本應該是cal
運行手殘腳本
會發現被卡住了
假裝排查代碼眼殘也沒發現問題哈哈哈哈
那么我們就可以用sh -x 來執行腳本
調試腳本
sh -x 腳本
這次可以清楚的看到卡在了哪一步?
這樣對我們的腳本排錯有很大的作用
然后我們改一下我們的腳本
腳本在指定環境中運行
.? ? ? ? 腳本
source????????腳本
直接執行腳本的絕對路徑 會直接新開bash來執行腳本
exit值
查看退出值
echo $?
退出值0為正常退出,非0值都是錯誤退出,不正常。
修改退出值
exit 你想要的退出值
打印文本
cat&tac
正向打印&反向打印
seq
注:只能打數字
seq 1 3
#打印1到3
seq 2 2 10
#打印2到10 步長為2
seq 1 2 10
#打印1到10 步長為2
echo
echo 123
echo "hello world"echo -n "hello world" //不換行打印echo -e "hello\tworld" //解析轉義字符
printf
printf "hello vb" //不換行打印
printf "hello vb\n" //換行打印printf "3%%" //打印百分號printf "%0.1f" "3.141592653579" //保留一位小數
printf "%0.2f" "3.141592653579" //保留兩位小數
printf "%0.3f" "3.141592653579" //保留三位小數
printf "%.3f" "3.141592653579" //保留三位小數
printf "%.2f" "3.141592653579" //保留兩位小數
printf "%.1f" "3.141592653579" //保留一位小數
printf "%.0f" "3.141592653579" //取整數
注:保留幾位小數都是會四舍五入的
uniq
對于命令輸出的字符冗余部分進行處理
注:只對有排序后的文件有用
vb里有實驗素材,就是這些無序的數字
-d #顯示重復的行
sort -n vb | uniq -d
-u #顯示唯一的行
sort -n vb | uniq -u
-c #合并重復并統計重復個數
sort -n vb | uniq -c
cut
用戶對字符的截取
生成實驗文件,我是從/etc/passwd中復制出來的
cut -d : -f 1 ./test
?指定分割符為 : 指定顯示的列為第1列 對當前目錄下的test文件作用
?指定分割符為 : 指定顯示的列為第1列到第3列?對當前目錄下的test文件作用?
cut -d : -f 1-3 ./test
?指定分割符為 : 指定顯示的列為第3列到最后一列 對當前目錄下的test文件作用
cut -d : -f 3- ./test
?指定分割符為 : 指定顯示的列為第1列和第3列?對當前目錄下的test文件作用
cut -d : -f 1,3 ./test
第一個字符到第四個字符
cut -c 1-4 ./test
第一個字符和第四個字符
cut -c 1,4 ./test
首字符到第八個字符
cut -c -8 ./test
第八個字符到末尾字符
cut -c 8- ./test
xargs
xargs 命令作用是將標準輸入數據轉換成命令行參數,能夠處理管道或者標準輸入并將其轉換成特定命令的命令參數
原本echo的輸出通過管道給touch是不能進行生成文件的操作的
所以我們需要用xargs來承接給touch(等那些不能直接接返回輸出進行操作的命令)命令
echo /mnt/vb{1..3} | xargs touch
多行輸入單行輸出
xargs < ./vb
?指定每行輸出個數
xargs -n 3 < ./vb
-n 3就是指定每行輸出個數為3個?
指定分隔符
echo "vb:vb:vb" | xargs -d :
指定的是:,輸出時將刪除分隔符再輸出?
echo "aaa:abc:cba:bba" | xargs -d a
同樣如果用了字符a來進行分割的話,可以看到下方效果顯示,將所有的字符a刪去空位符替代并輸出
用字符代替接收值
ls /mnt/* | xargs -I word rm -fr word
轉義
在shell中有很多本身有特殊功能的字符,比如空格井號等等
如果在給變量賦值或執行命令使用時我們只想使用這些符號本身那么就需要用到轉義或引用
在shell中反斜杠表示轉義,每個反斜杠只能轉義一個字符
在shell中單引號表示強引用,我們可以把它看作批量轉義,在單引號內的所有字符被視為字符本身
在shel中雙引號表示弱引用,其和單引號的區別在于不能引用(\!$)
單個轉義和多個轉義
單個轉義
可以用\
echo #helloworldecho \#helloworld
?
當我們需要轉義一串字符中含有空格斷開的一個井號時
我們需要用到多個轉義
"XXXXXXXXX"?
注:要想打出\,則需要用'\',而不是"\"
同樣的$,需要'$'才能轉義,而"$"會被注釋
變量
如果沒加local參數
環境級別變量只在當前運行的shell中生效,shell關閉變量被釋放
用戶級變量只有登錄系統的指定用戶,此變量才生效
系統級變量是系統中的永久設定,所有用戶都可以使用,系統變量通常被保存到/etc/profile中