為何叫做shell?
在介紹 shell 是什么東西之前,不妨讓我們重新審視使用者與電腦的關(guān)系。我們知道電腦的運(yùn)作不能離開硬件,但使用者卻無(wú)法直接對(duì)硬件作驅(qū)動(dòng),硬件的驅(qū)動(dòng)只能透過一個(gè)稱為“操作系統(tǒng)(operating system)”的軟件來(lái)控管,事實(shí)上,我們每天所談的linux,嚴(yán)格來(lái)說(shuō)只是一個(gè)操作系統(tǒng),我們稱之為“核心(kernel)”。然而,從使用者的角度來(lái)說(shuō),使用者也沒辦法直接操作kernel,而是透過kernel的“外殼”程序,也就是所謂的shell,來(lái)與kernel溝通。
這也正是kernel跟shell的形像命名關(guān)系。
從技術(shù)角度來(lái)說(shuō),shell是一個(gè)使用者與系統(tǒng)的互動(dòng)界面(interface),主要是讓使用者透過命令行(command line)來(lái)使用系統(tǒng)以完成工作。因此,shell的最簡(jiǎn)單的定義就是—命令解釋器(Command Interpreter):
將使用者的命令翻譯給核心處理,
同時(shí),將核心處理結(jié)果翻譯給使用者。
每次當(dāng)我們完成系統(tǒng)登入(log in),我們就取得一個(gè)互動(dòng)模式的shell,也稱為login shell或primary shell。若從行程(process)角度來(lái)說(shuō),我們?cè)趕hell所下達(dá)的命令,均是shell所產(chǎn)生的子行程。這現(xiàn)像,我們暫可稱之為fork。如果是執(zhí)行腳本(shell script)的話,腳本中的命令則是由另外一個(gè)非互動(dòng)模式的子shell(sub shell)來(lái)執(zhí)行的。也就是primary shell產(chǎn)生sub shell的行程,sub shell再產(chǎn)生script中所有命令的行程。(關(guān)于行程,我們?nèi)蘸笥袡C(jī)會(huì)再補(bǔ)充。)
這里,我們必須知道:kernel與shell是不同的兩套軟件,而且都是可以被替換的:
不同的操作系統(tǒng)使用不同的kernel,
而在同一個(gè)kernel之上,也可使用不同的shell。
bash編程也叫shell編程
預(yù)定義變量??????? $? 最后一次執(zhí)行的命令的返回狀態(tài)。如果這個(gè)變量的值為0,證明上一個(gè)命令正確的執(zhí)行;如果這個(gè)變量返回的值非0(具體是那個(gè)數(shù),有命令自己來(lái)決定),則證明上一個(gè)命令執(zhí)行不正確。??????? $$當(dāng)前進(jìn)程的進(jìn)程號(hào)(PID)??????? $!后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的進(jìn)程號(hào)(PID)? 運(yùn)算符??????? declare 聲名變量的類型?? ??????? declare [+/-][選項(xiàng)] 變量名??????? – 給變量設(shè)定類型屬性??????? + 取消變量的類型屬性??????? -i 將變量聲名為整數(shù)型??????? -x將變量什申明為環(huán)境變量??????? -p 顯示指定變量的被聲名的類型
舉例:
<p>a<span style="color: rgb(128, 128, 128)">=</span><span style="color: rgb(128, 0, 0); font-weight: bold">1</span><span style="color: rgb(0, 0, 0)">b</span><span style="color: rgb(128, 128, 128)">=</span><span style="color: rgb(128, 0, 0); font-weight: bold">2</span><span style="color: rgb(0, 0, 255)">declare</span> <span style="color: rgb(128, 128, 128)">-</span>i c <span style="color: rgb(128, 128, 128)">=</span> $a<span style="color: rgb(128, 128, 128)">+</span><span style="color: rgb(0, 0, 0)">$b c</span><span style="color: rgb(128, 128, 128)">=</span>$(($a<span style="color: rgb(128, 128, 128)">+</span>$b))</p><p>注意用雙小括號(hào),因?yàn)?a href="http://www.babyishan.com/tag/linux">linux中認(rèn)為一切皆為字符。</p><p>如果不加()當(dāng)成一個(gè)命令,shell腳本中Linux命令在 $() 中運(yùn)行,當(dāng)然可以直接寫命令,如果則一些引用命令時(shí) 就要 $()</p>
單分支if? 條件語(yǔ)句
if [ 條件判斷式 ];then程序 fior if [ 條件判斷式 ]then程序 fi
判斷登錄用戶是否為root用戶:
#!/bin/bash #grep 獲取行通配符 #cut 獲取列統(tǒng)配符,以 = 分割 2 獲取第二列 login_name=$(env | grep LOGNAME | cut -d "=" -f 2) #echo $login_nameif [ "$login_name" != "root" ]thenecho 'isnot root'fi
判斷根分區(qū)的占用率
#!/bin/bash #df -h 任性話顯示磁盤的利用率 #awk 獲取第五列 #cut 對(duì)字符用 % 進(jìn)行分割 獲取第一列值 result=$( df -h | grep sda1 | awk '{print $5}' | cut -d % -f 1)if [ "$result" -lt '90' ]thenecho 'the root dir is not full'fi
雙分支if條件語(yǔ)句
if [ 條件判斷式 ]then ...else... fi
判斷nginx 是否在運(yùn)行 (最好不用包含nginx作為文件名)
#!/bin/bash result=$(ps aux | grep nginx | grep -v grep)if [ -n "$result" ]thenecho "$(date) nginx is ok !"elseecho "$(date) nginx is not ok !" sudo /etc/init.d/nginx start &>/dev/nullecho "$(date) restart nginx !!" fi
多分支if語(yǔ)句
if []then elif []then...else ...if