亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

第一個 Shell 程序

1. Shell 腳本的構成及規范

Shell 腳本有一些約定俗成的規范,大家都遵循這些規則,編寫出來的腳本更能被大家接受,Shell 腳本其實不能稱為一門編程語言,它更像是一個工具,用來雜糅不同的程序及命令供我們調用來完成自己的預期操作。

1.1 命名規范

  • Shell 腳本在命名方面沒有嚴格的要求,但是我們命名需要遵循見名知意,即可通過 Shell 腳本的名稱知道其功能;
  • 文件名約定俗成以 .sh 結尾,方便識別其為 Shell 腳本文件;
  • 文件統一命名風格,寫 Shell 一般用小寫字母加下劃線,例如 install_mysql.sh, 我們看到該名稱就能知道其為一個安裝 mysql 的腳本文件。

1.2 Shell 腳本結構

Shell 腳本在其中的第一行需要有指明解釋器,在上面 CLI Shell 中的那些解釋器,都可以寫,在以./install_mysql.sh 的時候,此時就是利用腳本中第一行的解釋器來運行腳本,其格式為
#!Shell解釋器,例如#!/bin/bash, 但是這種方式存在一定的局限性,我們推薦使用 env 環境變量中的 bash,推薦使用這種方式#!/usr/bin/env bash

1.3 編碼統一

在編寫 Shell 的時候我們盡可能使用 UTF-8 編碼,可以支持中文及大多數符號,在其中我們注釋使用英文,例如在不支持中文的服務器上,腳本更好的支持。

1.4 作者信息

在編寫 Shell 腳本的時候,我們應該盡可能地指定 Shell 的描述信息,以及該腳本的作者,編寫該腳本的日期及聯系方式,以及腳本的版本,方便后期其他人閱讀及聯系。
例如在頭部添加如下注釋信息:

#!/bin/env bash
# Description: /mybin/myvim scripts
# Auth: kaliarch
# Email: [email protected]
# Date: 2020-02-15 13:36
# Version: 1.0

2. Shell 的運行方式

運行腳本可以歸納為三種方式,注意一般在運行腳本的時候為腳本添加 x 可執行權限

2.1 顯式指定解釋器執行

[root@shell workspace]# ll
total 4
-rw-r--r-- 1 root root 44 Sep  3 14:16 01-scripts.sh
[root@shell workspace]# cat 01-scripts.sh 
#!/bin/env bash
# Description: /mybin/myvim scripts
# Auth: kaliarch
# Email: [email protected]
# Date: 2020-02-15 13:36
# Version: 1.0

echo "this is my first script"
cd /
[root@shell workspace]# bash 01-scripts.sh 
this is my first script

在當前 bash 環境下,當前終端登錄的 Shell 為父 Shell,此種方式為在當前 Shell 下再啟動一個子進程來運行 Shell 腳本。

Tips: 此方法直接在終端指定解釋器來執行腳本,此時的解釋器為終端指定的,不使用腳本內第一行指定的解釋器執行,直接指定解釋器,此時不需要為腳本添加可執行權限。

2.2 直接指定腳本文件名稱

[root@shell workspace]# ll
total 4
-rw-r--r-- 1 root root 44 Sep  3 14:16 01-scripts.sh
[root@shell workspace]# . ./01-scripts.sh
-bash: ./01-scripts.sh: Permission denied
[root@shell workspace]# chmod +x 01-scripts.sh 
[root@shell workspace]# ll
total 4
-rwxr-xr-x 1 root root 44 Sep  3 14:16 01-scripts.sh
[root@shell workspace]# . ./01-scripts.sh 
this is my first script
[root@shell workspace]# /workspace/01-scripts.sh 
this is my first script

利用直接在終端指定腳本文件名稱方式執行,此種方式需要為腳本添加可執行權限,在當前 Shell 來執行,不啟動子 Shell,利用此種方式執行腳本的解釋器為腳本內的第一行指定的解釋器,例如此例中為#!/bin/bash,利用. 命令來執行腳本,一般用在當前目錄沒有在 PATH 中,所以第二個./ 是用來表示當前目錄的。

2.3 source 執行

[root@xuel-transfer workspace]# bash 01-scripts.sh
this is my first script
[root@xuel-transfer workspace]# ./01-scripts.sh
this is my first script
[root@xuel-transfer workspace]# source 01-scripts.sh
this is my first script
[root@xuel-transfer /]# pwd
/

利用此種方式也可執行腳本,此方式在當前上下文中執行腳本,不會生成新的子進程。腳本執行完畢,回到當前 Shell,腳本內如果有 cd 命令腳本退出后會影響當前的環境上下文,此種方式運行 Shell,腳本也可以沒有可執行權限。

3. 調試

在我們執行 Shell 腳本的時候為了方便排除異常,我們可以利用 -x 來開啟調試,例如

[root@xuel-transfer workspace]# bash -x 01-scripts.sh
+ echo 'this is my first script'
this is my first script
+ cd /

通過上面例子可以看出 + 后面為腳本的內容,沒有 + 的為腳本執行的輸出

同時我們為了方便查看腳本打印正在執行的命令,可以還可以利用 -v 參數。

4. 實例

4.1 第一個 Shell 需求

在此我們也不寫 Hello Shell 了,舉一個非常實用的例子,里面涉及的一些語法在后期的文章中大家都能學到,可以先按照操作步驟實現。
經過上面的學習,我們知道我們在寫 Shell 腳本的時候最好寫一些作者的信息,如果每次編寫都手動添加一次就很麻煩,如果是 IDE 一般工具都可以自定義配置添加首部 banner,但是在 Linux 系統內部編寫簡單 Shell 或文本,我們可以自定義小工具來實現。

4.2 思路

我們可以修改新增一個腳本將其添加進 PATH 中,如果利用此命令打開已存在的文件,利用 vim 直接打開,不對原內容作出更改,如果之前文件未存在,就在文件首部自動添加 banner 并用 vim 打開。

4.3 實現

  • 創建文件
    首先創建個文件 myvim
  • 編寫內容
#!/bin/env bash
# Description: /mybin/myvim scripts
# Auth: kaliarch
# Email: [email protected]
# function: auto generate banner
# Date: 2020-02-15 13:36
# Version: 1.0


# file not exist
[ $# -eq 0 ] && echo "$0 [file],At least one parameter!" && exit 1

# add banner
add_banner() {
cat > $1 << EOF
#!/bin/env bash
# Description: $0 scripts
# Auth: $USER
# Date: $(date +%F" "%H:%M)
# Version: 1.0
EOF
}

# exist file
for file in $*;
do
    if [ -f ${file} ];then
        vim ${file} && exit 0
    else
        touch ${file} && add_banner ${file} && vim ${file} && exit 0
    fi
done
  • 添加進 PATH 中
[root@devops-server mybin]# chmod +x myvim     # 添加可執行權限
[root@devops-server mybin]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@devops-server mybin]# echo "export PATH=\$PATH:/mybin" >> /etc/profile       # 將mybin添加進PATH中
[root@devops-server mybin]# source /etc/profile
[root@devops-server mybin]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/mybin

4.4 效果

利用 myvim 來編輯腳本可以自動生成 banner,再次打開可以繼續編輯,這樣就免去了我們每次手動編寫 banner 的麻煩。有興趣的同學可以進行嘗試,是不是感覺 Shell 可以為我們帶來無窮的樂趣。

5. 注意事項

  • 再次注意編寫 Shell 需要遵守其規范,這些約定俗成的規則能在日后的生產環境中為我們避免很多不必要的坑;
  • 學習 Shell 需要多動手實踐,實踐出真理,多寫勤練,針對結果多思考,熟練運用 man 指令來查看 Shell 腳本中常用的命令的參數及選項;
  • 舉一反三,針對一個腳本如何能無狀態,更健壯,更靈活易維護,需要多次的修改,反復的執行驗證,針對不同的應用場景,將數據抽象為參數進行傳遞,可以達到是事半功倍的效果。

6. 經驗分享

例如上面的我的第一個 Shell 腳本例子,再次只是拋磚引玉作用,我們還可以舉一反三思考更多的用處,例如,可以獲取天氣,利用自制小工具來進行 Shell 下快速翻譯等。

7. 小結

目前 Shell 的內容非常多,其作為用戶和系統內核的橋梁,其功能強大不言而喻,我們需要將有限的精力放在熱點知識上,好鋼用在刀刃上,注意學習方法學會舉一反三,這樣在后期的 Shell 學習中能夠更加地快速高效。