什麼是shell?

 



簡單的說,shell是我們與kernel溝通的介面,shell會把我們的語言轉成kernel看得懂得語言,這樣一來我們就能與kernel溝通了,Linux的架構大致上為:

user > shell > kernel > 硬體
user透過shell與kernel溝通,kernel就會驅動硬體作user的要求,大概就是這樣子!


shell 可以是文字模式或是圖形使用者介面,Linux一般講的是文字模式的shell,文字模式的shell功能強大,GUI雖然容易使用,但是功能卻大大不如文字模式,身為系統管理者學文字模式是絕對必要的!

shell有一些特殊的表示法:

* :代表任何,沒有字元或是任意字元
? :一定有一個字元
[xxx]:符合[]裡的條件,像是[0-9]為數字0到9,[abc]為a或b或c字元
^:否定的意思,[^abc]不要是a或b或c字元

範例:
[root@localhost CH6]# ls
1 12 123 1234 12345

目前我的目錄下有1 12 123 1234 12345這五個檔案:

[root@localhost CH6]# ls 1*
1 12 123 1234 12345

ls 1* 這個代表要列出1開頭的所有檔案,因為*可以是任意的,所以這五個檔案都會被列出來

[root@localhost CH6]# ls ?
1
[root@localhost CH6]# ls 1?
12
[root@localhost CH6]# ls 1??
123

這樣看應該很清楚吧! ?代表一定有一個字元所以第一個結果是列出1,第二個為列出開頭為1且檔名有兩個字的檔案,第三個為列出開頭為1且檔名有三個字的檔案

再來我又新增幾個檔案,21 22 31 32,這樣我目錄下共有:1 12 123 1234 12345 21 22 31 32

[root@localhost CH6]# ls [123]?
12 21 22 31 32

[123]? 代表開頭為1或2或3並且檔名為兩個字

[root@localhost CH6]# ls [^1]*
21 22 31 32

[^1]* 代表開頭不為1的所有檔案。


{}:這個符號可以將選定所有指定的內容,例如我要刪除file1、file3、file5這三個檔案可以這樣 rm file{1,3,5}這樣就會刪除這三個,記得要以,號隔開


command expansion
$() or ``,直接作範例說明:
[root@localhost CH6]# echo "This dir is `pwd`"
This dir is /tmp/RHCE/CH6
或是
[root@localhost CH6]# echo "This dir is $(pwd)"
This dir is /tmp/RHCE/CH6
``與$() 有執行指令的意思,先將裡面的指令執行完,並把執行結果輸出給 echo


tab鍵

鍵盤左邊的 tab鍵是相當好用的一個按鍵,shell會自動的幫你補齊指令:

假設當我輸入usera 的時後忘記接下來指令,我可以直接按一次tab鍵,他就會把useradd的命令補齊,這樣是不是很方便?
但要注意,usera 開頭的指令,因為符合的只有useradd,所以shell很快的就會把他補齊,如果符合的指令很多怎麼辦?

[root@localhost CH6]# user
useradd userdel userformat userhelper userinfo userisdnctl usermod usermount usernetctl userpasswd users
當我輸入user的時候,按一次tab鍵結果沒反應,這代表user的開頭的指令不只一個,所以會沒反應,這時只要按兩次tab鍵,shell就會把user開頭的指令列出來!

除了指令,也可以用在檔案上面,像是如果要切換到/etc/下的samba,在/etc/sam 按下tab會自動幫你補齊,方法都跟上面相同。


history

bash shell會將使用過的指令存到history檔案裡,預設會紀錄1000筆。藉由這個東西,還可以使用幾個方便的小技巧:

[root@localhost CH6]# history
990 ls
991 mv 01* manual/
992 ls
993 tar -zcvf manual.tar.gz manual/
994 ls
995 shutdown -h now; exit
996 cd /dev
997 ls
998 ls
999 cd /tmp
1000 ls
直接打history,會列出使用過的指令,如上面的範例

輸入 !!,會執行最後一次執行的指令,這邊最後一次執行的指令是 ls -al:
[root@localhost CH6]# !!
ls -al
總計 32
drwxr-xr-x 2 root root 4096 2008-11-28 10:32 .
drwxr-xr-x 3 root root 4096 2008-11-28 09:43 ..
-rw-r--r-- 1 root root 0 2008-11-28 09:43 1
-rw-r--r-- 1 root root 0 2008-11-28 09:43 12
-rw-r--r-- 1 root root 0 2008-11-28 09:43 123
-rw-r--r-- 1 root root 0 2008-11-28 09:43 1234
-rw-r--r-- 1 root root 0 2008-11-28 09:43 12345
-rw-r--r-- 1 root root 0 2008-11-28 09:49 21
-rw-r--r-- 1 root root 0 2008-11-28 09:49 22
-rw-r--r-- 1 root root 0 2008-11-28 09:49 31
-rw-r--r-- 1 root root 0 2008-11-28 09:49 32
-rw-r--r-- 1 root root 24043 2008-11-28 10:32 history.list


!char ,!後面接指令名稱會執行這個指令最後一次執行過的指令,這裡我輸入 !ls,上一次執行的指令為 ls -l ~:
[root@localhost ~]# !ls
ls -l ~
總計 5132
-rw------- 1 root root 1486 2008-07-10 16:34 anaconda-ks.cfg
-rw-r--r-- 1 root root 1271981 2008-09-22 09:17 docutils-0.5.tar.gz
-rw-r--r-- 1 root root 51129 2008-07-10 16:34 install.log
-rw-r--r-- 1 root root 5095 2008-07-10 16:27 install.log.syslog
-rw------- 1 root root 1877 2008-09-24 08:53 mbox


!n,數字為history的編號,參照history前的編號,我的997為ls:
[root@localhost ~]# !997
ls
anaconda-ks.cfg install.log.syslog normal_48e78730f3b41.jpg rst typescript 公共 文件 音樂
docutils-0.5.tar.gz mbox paxphotobook.zip test work 圖片 桌面
install.log normal_48e7872eb201b.jpg PloneDevBook1113.tar.gz test.zp 下載 影片 模板



字串替換

這個用在上一個執行的指令,^舊名稱^新名稱:

我先cp history history3,接著^history^history2 ,history2便會替換history,變成cp history2 history3
[root@localhost CH6]# cp history history3
[root@localhost CH6]# ^history^history2



其他快速鍵

搜尋:Ctrl+r,可以輸入指令,並將上次用過的顯示出來
按下Ctrl+r 會變(reverse-i-search)`':,接著在後輸入指令就會將上次用過的顯示在螢幕:(reverse-i-search)`ls': ls -al,我輸入了ls,顯示我上次使用的是ls -al,按下enter就會執行。

執行上一個的指令:有兩個快速鍵,ESC鍵+,鍵,令一個為 $!。


變數

命名,變數名稱=變數的值:
[root@localhost CH6]# HI="I am xiang"
[root@localhost CH6]# echo $HI
I am xiang
這裡設定變數HI的值為I am xiang,因為是字串所以要用""框起來。另外要注意,設定變數時直接輸入變數的名稱就可以,但在呼叫的時候要在前面加$。


f
創作者介紹
創作者 xiangyang17 的頭像
xiangyang17

xiangyang17

xiangyang17 發表在 痞客邦 留言(0) 人氣()