1. 程式人生 > >Shell基礎知識和編程規範

Shell基礎知識和編程規範

腳本開發 語句 相對路徑 升級 found chm 漏洞 環境變量 創建

一,Shell環境查看

1.1 查看系統Shell支持情況
[root@linux-node1 ~]# cat /etc/shells 
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
1.2 查看當前系統默認的Shell

方法一

[root@linux-node1 ~]# echo $SHELL
/bin/bash

方法二

[root@linux-node1 ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash

提示:後面/bin/bash就是用戶登陸後的Shell解釋器

二,Shell腳本的建立和執行

2.1 腳本開通(第一行)

一個規範的Shell腳本在第一行會指出由哪個程序(解釋器)來執行腳本中的內容,這一行內容在Linux bash的編程一般為

#!/bin/bash
或
#!/bin/sh #<---255個字符以內

其中,開頭的“#!"字符又稱為幻數,在執行bash腳本的時候,內核會根據“#!”後面的解釋器來確認哪個程序解釋這個腳本中的內容(註意 這一行必須在每個腳本頂端第一行)

2.2 bash與sh的區別

sh為bash的軟連接

[root@linux-node1 ~]# ll /bin/sh
lrwxrwxrwx. 1 root root 4 Aug 6 2016 /bin/sh -> bash
2.3 查看系統版本
[root@linux-node1 ~]# cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core) 

查看bash版本

[root@linux-node1 ~]# bash --version
GNU bash, version 4.2.46(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3
+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software; you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

測試bash是否有破殼漏洞,如果返回be careful,則表示需要盡快升級bash了

[root@xiewenming]# bash --version
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
[root@xiewenming]# 
[root@xiewenming]# env x=‘() { :;}; echo be careful‘ bash -c "echo this is a test"
be careful
this is a test
2.4 升級bash方法
[root@xiewenming]# yum -y update bash
[root@xiewenming]# rpm -qa bash
bash-4.1.2-48.el6.x86_64
[root@xiewenming]# env x=‘() { :;}; echo be careful‘ bash -c "echo this is a test"
this is a test  #再次執行已沒有be careful提示

提示:如果沒有輸出be careful,則不需要升級

2.5 腳本註釋

在Shell腳本中,跟再#後面的內容表示註釋,開發腳本時,如果沒有註釋,那麽團隊裏的其他人就會很難理解加班對應內容的用途,而且時間長了自己也會忘記。為了方便別人和方便自己,避免影響團隊的協助效率,

要養成一個寫關機註釋的習慣。腳本註釋盡量不要用中文,避免亂碼問題

2.6 Shell腳本的執行

當Shell腳本運行時,它會先查找系統環境變量ENV,改變量指定了環境文件,加載順利通車是/etc/profile ---> ~/.bash_profile ---> ~/.bashrc --->/etc/bashrc等,在加載了上述的環境變量文件後,Shell就開始執行腳本中的內容

通常情況下,在執行Shell腳本時,會向系統請求啟動一個新的進程,以便在該進程中執行腳本的命令及子Shell腳本。

提示:設置crond任務時,最好能再定時任務腳本中重新定義系統環境變量,否則,一些系統環境變量將不會被加載,這個問題需要註意!

Shell腳本的執行可以采用以下幾種方式:

1).bash 腳本名 或sh 腳本名 (推薦使用)

[root@linux-node1 ~]# bash test01.sh 
Welcome warren
[root@linux-node1 ~]# sh test01.sh 
Welcome warren

2). 使用腳本的絕對路徑執行 或相對路徑 ./腳本名 這個需要有文件的執行權限

[root@linux-node1 ~]# chmod +x test01.sh 
[root@linux-node1 ~]# /root/test01.sh
Welcome warren
[root@linux-node1 ~]# ./test01.sh
Welcome warren

3).source 腳本名 或 . 腳本名

[root@linux-node1 ~]# source test01.sh 
Welcome warren
[root@linux-node1 ~]# . test01.sh 
Welcome warren

4) sh < 腳本名 或 cat 腳本名|sh

[root@linux-node1 ~]# cat test01.sh 
echo "Welcome warren"
[root@linux-node1 ~]# sh < test01.sh 
Welcome warren
[root@linux-node1 ~]# cat test01.sh |bash
Welcome warren

使用cat 創建腳本文件

[root@linux-node1 ~]# cat > test02.sh
echo "this is test"

Ctrl+d結束編輯,這裏作為cat用法的擴展知識

父Shell不會繼承子Shell的環境變量,測試如下

[root@linux-node1 ~]# cat test.sh 
user001=`whoami`
[root@linux-node1 ~]# echo $user001
#空
[root@linux-node1 ~]# 

使用source導入子腳本的環境變量到當前環境就可以獲取子腳本的變量

[root@linux-node1 ~]# source  test.sh 
[root@linux-node1 ~]# echo $user001
root

三, Shell腳本開發的基本規範

Shell 腳本的開發規範及習慣非常重要,有了好的規範可以大大提升開發效率,並能再後期降低對腳本的維護成本。

1). Shell腳本的第一行是指定腳本介紹器

#!/bin/bash

2). Shell腳本的開通會加班表,版權等信息

#!/bin/bash
#Date: 2017-12-5
#Author: Created by warren
#Blog: http://www.cnblogs.com/xiewenming/
#Description: This scripts function is ...
#Version:1.1

可以修改“~/.vimrc”配置文件配置vim編輯文件時自動加上以上信息

3). 在Shell腳本中盡量不用中文,防止切換系統環境後中文亂碼的困擾。如果非要加中文,請根據系統進行字符集調整.

如: export LANG="zh_CN.UTF-8",並在腳本中,重新定義字符集設置,和系統保證一致。

4). Shell腳本的命名應以 .sh 為擴展名

例如: test.sh

5). Shell 腳本應存放在固定的目錄下

例如:/opt/scripts

四, Shell腳本書寫的良好習慣

1).成對的符合應盡量一次性寫出來,然後退格在符合裏增加內容,以防止遺漏。

這些成對的符合包括:

{}  []  ‘‘  ``  ""

2). 中括號兩端至少各一個空格,先退2格 然後進一格,雙括號也是如此

3). 對應流程控制語句,應一次將格式寫完,再添加內容。

比如,一次性完成if語句的格式,應為

if 條件內容
  then
    內容
fi

一次性完成for循環語句格式,應為

for
do
  內容
done

一次完成white語句格式,應為

white 條件
do
  內容
done

提示:until和case語句也一樣

4). 通過縮進讓代碼更易讀

5). 對應常規變量的字符串定義變量值應加雙引號,並且等號前後不能有空格

6). 腳本中的單引號和雙引號必須為英文狀態下的符合

7). 變量名稱應該具有相關意思,不能太隨便。

說明:好的習慣可以讓我們避免很多不必要的麻煩並提示工作效率

Shell基礎知識和編程規範