1.shell腳本基礎(chǔ)
1.1 shell環(huán)境
shell分類
Shell 編程跟 JavaScript、php 編程一樣,只要有一個(gè)能編寫代碼的文本編輯器和一個(gè)能解釋執(zhí)行的腳本解釋器就可以了。
Linux 的 Shell 種類眾多,常見的有:
- Bourne Shell(/usr/bin/sh或/bin/sh)
- Bourne Again Shell(/bin/bash)
- C Shell(/usr/bin/csh)
- K Shell(/usr/bin/ksh)
- Shell for Root(/sbin/sh)
- ……
Mac系統(tǒng)默認(rèn)的是zsh環(huán)境,ubuntu下默認(rèn)的shell環(huán)境是bash環(huán)境,可以通過執(zhí)行命令查看:
# ubuntu終端
xq@ubuntu:~$ echo $SHELL
/bin/bash
# mac電腦終端
? ~ echo $SHELL
/bin/zsh
一般系統(tǒng)都會(huì)內(nèi)置幾種shell,可以通過命令chsh
修改系統(tǒng)默認(rèn)的shell環(huán)境,在下次打開終端生效,修改示例如下:
# 查看系統(tǒng)中已安裝的shell類型
xq@ubuntu:~$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash
/usr/bin/dash
/bin/zsh
/usr/bin/zsh
# 切換默認(rèn)的shell環(huán)境到zsh
xq@ubuntu:~$ chsh -s /bin/zsh
# 切換默認(rèn)的shell環(huán)境到bash
xq@ubuntu:~$ chsh -s /bin/bash
shell配置文件
我們開發(fā)環(huán)境用的最多的就是bash和zsh了,下面就介紹這兩個(gè)shell為例介紹對(duì)應(yīng)的配置文件。
Bash的配置文件
- /etc/profile:為系統(tǒng)的每個(gè)用戶設(shè)置環(huán)境信息,當(dāng)用戶第一次登錄時(shí)會(huì)執(zhí)行該文件里的命令。默認(rèn)會(huì)直接調(diào)用/etc/bashrc。該文件的改動(dòng)需要重啟才能生效。
- /etc/bashrc:為每一個(gè)運(yùn)行bash shell的用戶執(zhí)行此文件。當(dāng)bash shell被打開時(shí),會(huì)讀取并執(zhí)行該文件中的命令。所以修改該文件后,重新打開Shell即可生效。
- ~/.bash_profile:和/etc/profile類似,但是只對(duì)當(dāng)前用戶生效。
- ~/.bashrc:和/etc/bashrc類似,但是只對(duì)當(dāng)前用戶生效。
- ~/.bash_logout:當(dāng)每次退出bash shell時(shí),執(zhí)行該文件。
- ~/.bash_history:保存了歷史命令。在Shell為Bash時(shí),每次敲擊命令時(shí),都會(huì)保存在這個(gè)文件里
加載順序:/etc/profile、/etc/bashrc、 /.bash_profile、 /.bashrc
Zsh的配置文件
- ~/.zshenv:存放的環(huán)境變量配置項(xiàng)在任何場(chǎng)景下都能被讀取,這里通常把$PATH等變量寫在這里,這樣無論是在交互shell,或者運(yùn)行程序都會(huì)讀取此文件。個(gè)人理解對(duì)標(biāo)Bash的profile。
- ~/.zprofile:和.zlogin類似,但是是在.zshrc之前加載。
- ~/.zshrc:在交互式shell中會(huì)讀取并執(zhí)行該文件,包含設(shè)置別名、函數(shù)、選項(xiàng)、鍵綁定等命令。對(duì)標(biāo)bashrc。
- ~/.zlogin:在login shell的時(shí)候讀取。
- ~/.zlogout:退出終端的時(shí)候讀取,用于做一些清理工作。對(duì)標(biāo)bash_logout。
- ~/.zsh_history:保存了歷史命令。在Shell為Zsh時(shí),每次敲擊命令時(shí),都會(huì)保存在這個(gè)文件里。
加載順序:zshenv、zprofile、zshrc、zlogin
1.2 shell腳本
由于bash腳本使用場(chǎng)景更廣泛,如android源碼build目錄中各種shell腳本,下面就以bash腳本為例進(jìn)行講述。
shell沒有官方的ide支持,可以通過vscode + shellman插件來實(shí)現(xiàn)高效編寫。shellman插件有進(jìn)行命令與模版提示的功能。
腳本文件一般以.sh
結(jié)尾(擴(kuò)展名并不影響腳本執(zhí)行),文件第一行指定運(yùn)行的shell解釋器類型。
#! 是一個(gè)約定的標(biāo)記,它告訴系統(tǒng)這個(gè)腳本需要什么解釋器來執(zhí)行,即使用哪一種 Shell。
#!/bin/bash
echo "Hello World !"
還有一種指定shell解釋器的寫法是通過env來聲明
#!/usr/bin/env bash
echo "Hello World !"
運(yùn)行方式
- 作為可執(zhí)行程序
以腳本中聲明的shell解釋器運(yùn)行,示例如下:
chmod +x ./test.sh #使腳本具有執(zhí)行權(quán)限
./test.sh #執(zhí)行腳本
- 作為解釋器參數(shù)
這種運(yùn)行方式是,直接運(yùn)行解釋器,其參數(shù)就是 shell 腳本的文件名,會(huì)忽略腳本中指定的解釋器信息
如:
# 以zsh解析運(yùn)行
zsh test.sh
# 以bash解析運(yùn)行
bash test.sh
調(diào)試
shell腳本不能像android studio里面可以打斷點(diǎn)方式調(diào)試,但是可以通過特定方式把執(zhí)行過程都打印出來來排查問題。
對(duì)整個(gè)腳本加調(diào)試可以通過在指定解釋器的地方添加-x
參數(shù)
#!/usr/bin/env bash -x
echo "Hello World !"
或者
bash -x test.sh
如果是針對(duì)特定的代碼塊加調(diào)試可以通過下面的方式實(shí)現(xiàn):
set -x
調(diào)試內(nèi)容
set +x
示例代碼如下:
set -x
echo "hello"
echo "world"
set +x
# 輸出結(jié)果,帶+的為執(zhí)行過程打印
+ echo hello
hello
+ echo world
world
+ set +x
-
Linux
+關(guān)注
關(guān)注
87文章
11292瀏覽量
209323 -
PHP
+關(guān)注
關(guān)注
0文章
452瀏覽量
26678 -
編輯器
+關(guān)注
關(guān)注
1文章
805瀏覽量
31163 -
Shell腳本
+關(guān)注
關(guān)注
0文章
36瀏覽量
7971
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論