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