簡介
shell是一個命令解釋器
適合用於處理純文本類型的數據
shell腳本語言是弱類型語言(無須定義變量的類型即可使用)
Unix/linux中主要有兩大類shell:Bourne shell、C shell
[root@wangxian ~]# cat /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin
其他常用的腳本語言種類
PHP:更專注於web頁面開發
python:優勢在於開發較負載的運維工具軟件、web界面的管理工具和web業務的開發等
perl:比shell腳本語言強大很多,語法靈活、複雜,缺點是不易讀、團隊協作難
查看操作系統的shell
[root@wangxian ~]# echo $SHELL /bin/bash [root@wangxian ~]# grep root /etc/passwd root:x:0:0:root:/root:/bin/bash
shell腳本的建立和執行
shell腳本的建立
1、規範的腳本會在第一行指出由哪個程序(解釋器)來執行腳本中的內容
#! /bin/bash
#!爲幻數,內核會根據“#!”來確定該用哪個程序解釋這個腳本中的內容
這一行必須位於每個腳本頂端的第一行,如果不是第一行則爲腳本註釋
2、bash與sh的 區別
大多數情況下,腳本開頭的#! /bin/bash和#! /bin/sh沒有區別,規範的寫法開頭使用#! /bin/bash。
如果使用/bin/sh執行時出現問題,再用bash試下,一般不會出現此問題
bash的版本、測試以及升級
[root@wangxian ~]# bash --version GNU bash, version 4.2.46(2)-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. [root@wangxian ~]# env x='() { :;}; echo be careful' bash -c "echo this is a test" this is a test
yum –y update bash
PS:如果測試沒有提示be careful,則不需要升級
centos默認的shell均爲bash
shell腳本的執行
當shell腳本運行時,它會先查找系統環境變量ENV,該變量指定了環境文件(加載順序通常是/etc/profile、~/.bash_profile、~/.bashrc、/etc/bashrc等),然後開始執行腳本中的內容
shell腳本的執行通常的幾種方式
1、bash script-name或sh script-name(沒有執行權限也行,推薦此方法)
2、path/ script-name或./ script-name:指在當前路徑下執行腳本,需要執行權限
3、source script-name或. script-name(也可以不需要執行權限)
使用此方法可以將sun.sh自身腳本中的變量值或函數等的返回值傳遞到當前父shell腳本father.sh中使用
4、sh< script-name或cat script-name|sh
第三種方法與其他方法不同的例子:
[root@wangxian ~]# echo 'userdir=`pwd`' >testsource.sh [root@wangxian ~]# cat testsource.sh userdir=`pwd` [root@wangxian ~]# sh testsource.sh [root@wangxian ~]# echo $userdir [root@wangxian ~]# source testsource.sh [root@wangxian ~]# echo $userdir /root [root@wangxian ~]#
結論:通過source或‘.’加載執行過的腳本,由於是在當前shell中執行腳本,因此在腳本結束之後,腳本中的變量(包括函數)值在當前shell中依然存在,而sh和bash執行腳本都會啓動新的子shell執行,執行完後退回到父shell,因此變量值等無法保留。
shell腳本開發的基本規範及習慣
1、第一行指定解釋器
2、腳本開頭會加版本、版權、腳本的功能等信息
3、儘量不使用中文,如果要使用,調整字符集,export LANG=”zh_CN.UTF-8”
4、腳本命名 .sh擴展名
5、腳本應放在固定的路徑下
腳本代碼書寫習慣:
1、成對的符號應儘量一次性寫出來{} [] ‘’ “” ``
2、中括號[]兩端至少要有1個空格
3、對於流程控制語句,應一次性將格式寫完,再添加內容
一次性完成if語句的格式,應爲:
if 條件內容
then
內容
fi
一次性完成for循環語句的格式,應爲:
for
do
內容
done
4、通過縮進讓代碼更易讀
5、對於常規變量的字符串定義變量值應加雙引號,並且等號前後不能有空格
需要強引用的(指所見即所得的字符引用),則用單引號(''),如果是命令的引用,則用反引號。
6、腳本中的單引號、雙引號及反引號必須爲英文狀態下的符號