初識Shell——bash
Linux中的shell有點類似Windows下的cmd.exe或者.bat。管理整個計算機硬件的其實是操作系統的內核(Kernel),用戶無法與內核直接交互,所以通過shell來跟內核通信。即shell介於操作系統(Kernel)和用戶之間,它是用戶與內核的翻譯官,是一個命令解釋器。
常見的shell種類有:Bsh、Csh、Ksh、Bash、Zsh
Bsh和Csh出現的較早,Ksh繼承了它兩的功能,Bash繼承了Bsh和Ksh的升級版,而且是Linux系統中默認的shell,Zsh則兼具了各種shell的程序有點,交互式操作效率更高,但仍不及bash應用廣泛。
Shell環境的切換:
登錄Shell:指用戶每次登錄系統后自動加載的Shell程序,大多數Linux系統采用 /bin/bash 作為默認登錄Shell;/etc/shells 文件記錄了系統支持的有效登錄Shell
[root@localhost ~]# cat /etc/shells ==>使用chsh -l命令也可查看 /bin/sh /bin/bash /sbin/nologin /bin/tcsh /bin/csh /bin/ksh [root@localhost ~]#
默認的shell是bash,那么如何切換shell環境呢?分為兩種,一種是臨時切換,即當此終端關閉時,下次啟動仍然是bash,方法很簡單,直接在終端輸入shell名稱;第二種則是更改用戶登錄Shell,需要修改/etc/passwd文件中用戶記錄的最后一個字段,或者像前面講到的使用修改用戶的命令:usermod -s shell程序路徑 用戶名,也可以使用chsh命令,下次登錄有效。
查看當前shell可以通過/etc/passwd來查看,要查看系統默認使用的shell,可以使用echo $SHELL。
bash的常用功能:
類型 |
設備文件 |
文件描述編號 |
默認設備 |
標准輸入 |
/dev/stdin |
0 |
鍵盤 |
標准輸出 |
/dev/stdout |
1 |
顯示器 |
標准錯誤輸出 |
/dev/stderr |
2 |
顯示器 |
(備注:/dev/stdin、/dev/stdout、/dev/stderr這三個文件是一個符號鏈接,輸入輸出與重定向關系緊密)
類型 |
操作符 |
用途 |
重定向標准輸入 |
< |
將命令中接收輸入的途徑由默認的鍵盤更改為指定的文件 |
重定向標准輸出 |
> |
將命令的執行結果輸出到指定的文件中,而不是直接顯示在屏幕上 |
>> |
將命令執行的結果追加輸出到指定文件 |
|
重定向標准錯誤 |
2> |
清空指定文件的內容,並將標准錯誤信息保存到該文件中 |
2>> |
將標准錯誤信息追加輸出到指定的文件中 |
|
重定向標准輸出和 標准錯誤 |
&> |
將標准輸出、標准錯誤的內容全部保存到指定的文件中,而不是直接顯示在屏幕上 |
管道操作符號是“|”,連接左右兩個命令,將左側的命令輸出的結果,作為右側命令的輸入(處理對象)。管道是腳本語言的特色,它可以講多個功能連接起來形成一個大的功能,這點與面向對象有很大的不同。
例如我現在要查看歷史記錄命令的第4行:則可先將前4條命令顯示出來,在顯示前4條命令的最后一條:history | head -4 | tail -1 這樣即取出了第四條命令。
Shell變量
Shell變量和其他語言的變量含義大同小異,就是可以存放不同的內容,它也為靈活管理Linux系統提供特定參數。一般有兩層意思:變量名:使用固定的名稱,由系統預設或用戶定義;變量值:能夠根據用戶設置、系統環境變化而變化。
Shell變量的種類:
變量的賦值與引用:
定義新的變量名要以英文字母或下划線開頭,區分大小寫,格式為:變量名=變量值
查看變量的值:echo $變量名
[root@localhost ~]# DAY=Sunday [root@localhost ~]# echo $DAY ==>通過$符號引用指定名稱的變量值 Sunday [root@localhost ~]#
(注意:在查看變量時,如果變量名容易和后邊的字符串連在一起導致混淆,則應該使用大括號將變量名括起來,使用形式為:${變量名} ,例如: 若已知變量Var的值為Benet,則執行“echo $Var3.0”命令后將顯示結果“.0”而不是“Benet3.0”,因為在該命令中,會將“Var3”當成變量名(默認未定義此變量)。若希望正確顯示“Benet3.0”的輸出結果,則需要執行“echo ${Var}3.0”)
[root@localhost ~]# Var =Benet [root@localhost ~]# echo $Var Benet [root@localhost ~]# echo $Var3.0 .0 [root@localhost ~]# echo ${Var}3.0 Benet3.0 [root@localhost ~]#
從鍵盤輸入內容為變量賦值,格式為:read [-p "輸入信息"] 變量名
[root@localhost ~]#read var haha ==>這里等待輸入 [root@localhost ~]#echo $var haha [root@localhost ~]#
在給變量賦值時,使用不同的引號操作的區別:
[root@localhost ~]#name=jzhou [root@localhost ~]#echo $name jzhou [root@localhost ~]#myname="$name is me" ==>這里使用的是雙引號 [root@localhost ~]#echo $myname jzhou is me ==>將$name這個變量執行出來了 [root@localhost ~]#myname='$name is me' ==>這里使用的是單引號 [root@localhost ~]#echo $myname $name is me ==>原樣顯示出來了,$name沒有執行 [root@localhost ~]#
[jzhou@localhost ~]$ locate crontab /etc/anacrontab /etc/crontab /usr/bin/crontab /usr/share/man/man1/crontab.1.gz ..... [jzhou@localhost ~]$ ls -l `locate crontab` ==>先執行locate crontab,再執行ls -l -rw-r--r-- 1 root root 298 2006-12-18 /etc/anacrontab -rw-r--r-- 1 root root 255 2006-07-15 /etc/crontab -rwsr-sr-x 1 root root 315416 2008-07-15 /usr/bin/crontab -rw-r--r-- 1 root root 1846 2008-07-15 /usr/share/man/man1/crontab.1.gz ..... [jzhou@localhost ~]$
設置變量的作用范圍,格式:export 變量名
一般情況下,父進程的自定義變量是無法在子進程中使用的,但是通過export將變量變成環境變量后,就能夠在子進程下使用了。
[root@localhost ~]#name=jzhou [root@localhost ~]#echo $name jzhou [root@localhost ~]# export name ==>輸出為全局變量 [root@localhost ~]# zsh [root@localhost]~# echo $name jzhou [root@localhost]~# exit [root@localhost root]# unset name==>消除變量內容 [root@localhost root]# echo $name [root@localhost ~]#
變量還有一個好處,當您經常訪問一個目錄時,而且這個目錄比較長,可以將它付給一個簡單的變量,這樣進入這個目錄時候只需cd 變量就行了。如work="~/temp/2013/test/",則進入這個目錄只需cd work。
數值變量的運算:
之前講到過可以使用命令bc來打開一個計算器,其實Bash程序並不適合進行強大的數學運算,例如小數或指數運算的,一般只能進行簡單的整數運算,若不使用bc,則也可以使用下列格式來進行簡單數值計算:
格式:expr 變量1 運算符 變量2 [..運算符 變量n...]
expr命令常用的運算符有:+、-、\*(注意要有\)、/、%
[jzhou@localhost ~]$ expr 10 * 2 expr :語法錯誤 [jzhou@localhost ~]$ expr 10 \* 2 20 [jzhou@localhost ~]$expr 10 + 2 12 [jzhou@localhost ~]$
環境變量
環境變量配置文件:全局配置文件:/etec/profile
用戶配置文件:~/.bash_profile
查看環境變量:env
set (set命令可以查看所有的Shell變量,其中包括環境變量)
常見的環境變量:
位置變量:
表示為$n,n為1~9之間的數字,$n的作用就是為腳本文件傳遞執行參數。
[jzhou@localhost ~]ls -a -l -l ==>a就是第1個位置變量,依次類推,其實這個命令就是ls -al
預定義變量:
[root@localhost ~]# bash [root@localhost ~]# echo $0 $$ ==>查看當前所執行進程的名稱、PID號 -bash 32484 [root@localhost ~]# exxit ==>執行一條錯誤的命令 bash: exxit: command not found [root@localhost ~]# echo $? 127 ==>返回非0值,表示上一條命令異常 [root@localhost ~]# exit exit [root@localhost ~]# echo $? 0 ==>返回0,說明上一條命令正常
靈活使用這些變量,將大大增強Shell腳本程序的功能,$0作為預定義變量,表示當前執行的程序名,需要與$1~$9的位置變量區分開。
引入shell腳本
shell腳本:
[root@localhost ~]# vi repboot.sh #!/bin/bash ==>聲明使用的shell環境,根據執行的方式不同可加可不加 # To show usage of /boot directory and mode of kernel file. echo "Useage of /boot: " du -sh /boot echo "The mode of kernel file:" ls -lh /boot/vmlinuz-* [root@localhost ~]# chmod a+x repboot.sh
如有錯誤,歡迎指正。