1. 程式人生 > >《shell編程實戰》第2章shell腳本入門

《shell編程實戰》第2章shell腳本入門

shell 編程 老男孩 bash

《shell編程實戰》第2章shell腳本入門
1、shell是什麽
shell是一個命令解釋器,它的作用是解釋執行用戶輸入的命令和程序,負責與用戶直接對話,把用戶的輸入解釋給操作系統,並處理各種各樣的操作系統的輸出結果,然後輸出到屏幕返回給用戶。簡單地說,shell翻譯用戶的話給內核,內核聽後控制硬件工作,工作完內核將結果告訴shell,shell再打印給用戶看。shell是用戶和內核乃至硬件之間溝通的橋梁。
用戶敲命令->shell翻譯-內核控制->硬件工作->內核結果上報->shell打印->用戶得到答案
shell英文意思為“貝殼”,linux裏是說就像貝殼一樣包住系統內核和硬件。
2、什麽是shell腳本
當命令或程序語句不在命令行下執行,而是通過程序文件的形式在shell中執行,這個程序就被稱為shell腳本。shell腳本是針對給shell用的,它將一些shell的語法與命令寫在裏面,搭配正則表達式、管道、重定向等,實現我們想要的功能。
例1、寫一個清除/var/log/messages的命令腳本。
#!/bin/bash
#version:v1.0
echo > /var/log/messages && echo "Log cleaned up."
這樣基本就OK了。但仔細思考一下,這個腳本還是有一些問題的,具體如下:
(1)非root用戶沒有權限執行這條命令。
(2)只管進行順序操作,沒有流程控制語句。
例2、寫一個腳本,功能一樣但要帶流程控制。每一步執行成功或失敗都應該有提示。
#!/bin/bash
#version:v2.0
#首先判斷是不是root,然後判斷日誌目錄是否存在,再判斷日誌是否存在,最後清空日誌。
#判斷是不是root($UID是否為0)
if [ $UID -ne 0 ]
then echo "Must be root!"
exit 1 #返回1表示腳本執行失敗了
fi
echo "You are root."
#判斷日誌目錄是否存在
cd /var/log || {
echo "Cannot change to the directory."
exit 1
}
#清空日誌
echo > messages && {
echo "Log cleaned up."
exit 0
}
echo "Log cannot clean up."
exit 1
重要提示:花括號{}的位置一定不能打錯!!筆者打到了“exit 1”"exit 0"的後面:
cd /var/log || {
echo "Cannot change to the directory."
exit 1}
然後就提示logclean4.sh: line 29: syntax error: unexpected end of file。找了一個小時也沒找出哪裏錯了!建議還是跟按老男孩一模一樣的敲。
3、shell的地位
shell腳本適合用來處理純文本類型的數據,而Linux中幾乎所有服務的配置和日誌文件都是純文本類型的。因此,學好shell腳本能在linux系統中發揮巨大作用!
4、shell的種類
(1)Bourne shell,包括sh、ksh、bash三種。
(2)C shell,包括csh、tcsh兩種。
查看linux支持的shell:cat /etc/shells
5、其它腳本語言對比
(1)PHP,專註於WEB開發
(2)Perl,語法較復雜
(3)Python,在掌握shell編程之後可深入學習
相比而言,shell的優勢在於處理偏操作系統底層的業務。一些常見的系統腳本,使用shell開發會更簡單快速。
6、查看操作系統默認的shell
老男孩書裏給出了兩種方法,不過第二種方法好像不太適合我。視頻裏給出了第三種方法,網上有第四方法:
(1)[root@thzzc1994 ~]# echo $SHELL
/bin/bash
(2)[root@thzzc1994 ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
這種方法改進一下,在root前面加個^,表示root打頭的一行就行了:
[root@thzzc1994 ~]# grep ^root /etc/passwd
root:x:0:0:root:/root:/bin/bash
(3)[root@thzzc1994 ~]# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
(4)[root@thzzc1994 ~]# grep SHELL /etc/default/useradd
SHELL=/bin/bash
這種方法還可以等同於
[root@thzzc1994 ~]# useradd test
[root@thzzc1994 ~]# tail -1 /etc/passwd
test:x:501:501::/home/test:/bin/bash

附錄:
1、清空日誌的四種方法
(1)echo "" > test.log
(2)echo > test.log
(3)> test.log
(4)cat /dev/null > test.log
2、查看bash版本
bash --version

《shell編程實戰》第2章shell腳本入門