Linux學習筆記(七)——初識bash


                  初識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的常用功能:

1)Tab鍵自動補齊
這個功能可以讓您少打很多字,並且確定輸入是正確的。tab鍵接在一串命令的第一個字后面,則為命令補全;若接在一串命令的第二個字后面,則為文件補全;直接在bash提示符后面按兩下tab鍵,則能顯示所有可執行的命令。
2)命令編輯快捷鍵
如之前提到的ctrl+D,ctrl+L,ctrl+U等
3)命令歷史
 保存用戶曾經執行過的命令操作;存放位置是:~/.bash_history隱藏文件;查看歷史命令只需使用history命令就行了。
 調用歷史命令:
  !n:執行歷史記錄中的第n條命令
  !str:執行歷史記錄中以“str”開頭的命令
 設置記錄歷史命令的條數:修改HISTSIZSE參數即可(在/etc/profile文件里),默認為1000條。
(備注:正確使用歷史命令可以有效提高命令行輸入的效率,例如:如果之前不久執行過“service network restart”命令,則重新修改了網卡的配置文件以后,通常只需要執行“!ser”操作即可調用該歷史命令,以重啟network服務。合理控制歷史命令的條數可以提高安全性,root用戶的命令歷史一般建議設置為少於100條
4)命令別名
 為使用較高的復雜命令行設置間斷的調用名稱,存放位置是:~/.bashrc隱藏文件。查看命令別名只需用alias命令即可。
(備注:手動使用alias命令設置的別名只在當前Shell環境中有效,如alias rm='rm -i';若需每次登錄Shell環境時設置的別名都有效,需要修改宿主目錄中的“.bashrc”文件,添加相應別名設置
5)標准輸入輸出
交互式硬件設備:  
標准輸入:從該設備接收用戶輸入的數據
標准輸出:通過該設備向用戶輸出數據
標准錯誤:通過該設備報告執行出錯信息

類型

設備文件

文件描述編號

默認設備

標准輸入

/dev/stdin

0

鍵盤

標准輸出

/dev/stdout

1

顯示器

標准錯誤輸出

/dev/stderr

2

顯示器

(備注:/dev/stdin、/dev/stdout、/dev/stderr這三個文件是一個符號鏈接,輸入輸出與重定向關系緊密)

6)重定向操作
改變標准輸入、標准輸出、標准錯誤的方向:

類型

操作符

用途

重定向標准輸入

<

將命令中接收輸入的途徑由默認的鍵盤更改為指定的文件

重定向標准輸出

>

將命令的執行結果輸出到指定的文件中,而不是直接顯示在屏幕上

>>

將命令執行的結果追加輸出到指定文件

重定向標准錯誤

2>

清空指定文件的內容,並將標准錯誤信息保存到該文件中

2>>

將標准錯誤信息追加輸出到指定的文件中

重定向標准輸出和

標准錯誤

&>

將標准輸出、標准錯誤的內容全部保存到指定的文件中,而不是直接顯示在屏幕上

7)管道操作

  管道操作符號是“|”,連接左右兩個命令,將左側的命令輸出的結果,作為右側命令的輸入(處理對象)。管道是腳本語言的特色,它可以講多個功能連接起來形成一個大的功能,這點與面向對象有很大的不同。

  例如我現在要查看歷史記錄命令的第4行:則可先將前4條命令顯示出來,在顯示前4條命令的最后一條:history | head -4  |  tail  -1   這樣即取出了第四條命令。

Shell變量

Shell變量和其他語言的變量含義大同小異,就是可以存放不同的內容,它也為靈活管理Linux系統提供特定參數。一般有兩層意思:變量名:使用固定的名稱,由系統預設或用戶定義;變量值:能夠根據用戶設置、系統環境變化而變化。

Shell變量的種類:

用戶自定義變量:由用戶自己定義、修改和使用
環境變量:由系統維護,用於設置用戶的Shell工作環境,只有極少數的變量用戶可以修改
預定義變量:Bash預定義的特殊變量,不能直接修改
位置變量:通過命令行給程序傳遞執行參數,如ls -l  /etc/httpd,其中后面兩個參數可視為位置參數。

變量的賦值與引用:

定義新的變量名要以英文字母或下划線開頭,區分大小寫,格式為:變量名=變量值

查看變量的值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 ~]#

    在給變量賦值時,使用不同的引號操作的區別:

1)使用雙引號時,允許在雙引號的范圍內使用“$”符號引用其他變量的值(變量引用)
2)使用單引號時,將不允許在單引號的范圍內引用其他變量的值,“$”符號或者其他任何符號將作為普通字符看待
[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 ~]#
3)使用反撇號時,允許將執行特定命令的輸出結果賦值給變量(命令替換), 反撇號中的內容要求是可執行的命令。 需要嵌套使用時,可以將反撇號改為 $( ... ) 的形式
     這么說吧,在一串命令中,在`之內的命令會被先執行,然后將其執行出來的結果作為外部的輸入信息。
[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變量,其中包括環境變量)

 常見的環境變量:

$USER、$LOGNAME變量表示當前用戶的登錄名稱
$UID變量表示當前用戶的UID號
$SHELL變量表示用戶使用的登錄Shell
$HOME變量表示用戶的宿主目錄
$PWD變量表示用戶當前的工作目錄
$PS1和$PS2變量分別代表了當前用戶的主提示符(命令行提示符)和輔助提示符(例如,執行at命令后的“>”)

 位置變量:

    表示為$n,n為1~9之間的數字,$n的作用就是為腳本文件傳遞執行參數。

    在使用 ls命令的時候,ls命令程序如何知道用戶是否輸入了“-l”、“-a”選項?如何知道用戶要查看的是哪個目錄?位置變量正是用來解決這個問題的,它可以將用戶在命令行輸入的參數復制給特定的變量,然后交給程序去處理
例如當執行“service network restart命令行時,第1個位置參數用“$1”表示,對應的值為“network”,第2個位置參數用“$2”表示,對應的值為“restart”;當用戶輸入的位置參數超過9個時,位置變量 $9 將自動包含最后部分的所有字符串(即使有空格分隔)
[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腳本:

用途:完成特定的、較復雜的系統管理任務
格式:集中保存多條Linux命令,普通文本文件
執行方式:按照預設的順序依次解釋執行
Shell腳本類似於Windows系統中.bat批處理文件,只需要有相應的命令解釋器即可,不需要編譯
  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 
Shell腳本文件的擴展名並無嚴格的約束,不一定非得是“.sh”結尾,只是便於識別
 
運行Shell腳本程序:
直接執行具有“x”權限的腳本文件
    例如:./repboot.sh
使用指定的解釋器程序執行腳本內容
    例如:bash  repboot.sh、sh  repboot.sh
通過source命令(或 . )讀取腳本內容執行
    例如:souce  repboot.sh  或  .   hello.sh
(說明:
在調試階段可以使用Shell程序直接調用腳本文件,不要求腳本具有可執行權限,格式是:bash 腳本名
為腳本文件設置了可執行屬性后,在Shell命令行中可以直接通過腳本文件的路徑執行腳本程序
使用Bash的內部命令“.”腳本文件執行時,將不會開啟新的Shell環境。使用這種方式時,腳本文件作為“.”命令的參數,因此同樣不要求具備可執行權限。
 
 

如有錯誤,歡迎指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM