1 什麼是Bash 什麼是Shell
Bash 是 GNU Bourne-Again SHell,是目前大多數Linux發行版采用的Shell。
Shell 是 *nix提供給用戶使用的界面。
一個操作系統的底層是獨立運行的,用戶界面和底層分開,可以最大限度的保證系統穩定。Shell就是一個特殊的程序,負責接受用戶的命令,並把系統的響應返回給用戶。
Bash Shell一般不需要自己安裝,在安裝發行版的同時都會安裝好。
Shell的存在是和登陸相關的,從用戶名密碼驗證通過以後,Shell就啟動了,知道你退出,Shell就結束了運行。
除了Bash Shell之外,還有很多其他的Shell。
2 Linux的文件、目錄、程序
Linux的文件、目錄、程序是使用bash操作的主要對象。有必要事先了解一下文件、目錄和程序的概念
文件
Linux中一切都是文件、普通的文件、設備文件、管道也是文件的形式。一切操作都是文件為基礎的。DOS操作系統早期也是模擬這種方式,不過有很多漏洞(比如C:\con\con會藍屏)
文件是有屬性的,有一個屬性表示這個文件是不是目錄,有3個屬性表示這個文件的訪問權限,還有一些表示從這個文件派生出的文件屬性。
目錄
目錄是管理文件的手段,不同的文件要分門別類才容易找到。嚴格的說,目錄也是一種文件,是具有目錄屬性的文件。
文件和目錄都有所有者和所有組。叫UID和GID,對應的,有3個屬性表示相應的權限。後面寫到ls和chmod有詳細地說明。
程序
程序是可以執行的代碼,有些是直接交給內核或者CPU執行的,有些是通過其他程序執行的(解釋腳本),可以運行的程序都有一個可執行的屬性。
3 簡單的命令 ls cp mv mkdir rm chown chmod
前面說了一些枯燥的概念,現在趁著看官還沒有煩躁,開始實際操作的例子。
QUOTE:
Last login: Mon Aug 14 21:52:47 2006 from 61.149.202.143
[root@CERNET ~]#
這就是bash登陸後的樣子。#井號是root特權用戶的提示符號,一般用戶提示符是$符號。
現在輸入ls,列出當前目錄的內容
QUOTE:
[root@CERNET ~]# ls
anaconda-ks.cfg install.log.syslog log4cplus-1.0.2 MceMonitor-install-files.tgz.md5sum vmstat_monitor
Ice-3.0.1 jwsmtp-1.32.11 log4cplus-1.0.2.tar.gz memcached-1.1.12 wuhan.sh
Ice-3.0.1.tar.gz jwsmtp-1.32.11.tar.gz login_keepalived memcached-1.1.12.tar.gz
ids.sh libevent-0.8 MceMonitor sar.log
install.log libevent-0.8.tar.gz MceMonitor-install-files.tgz tmp
再輸入cd /,把當前目錄改為根目錄
QUOTE:
[root@CERNET /]# ls
bin data etc home lib media mnt proc sbin srv tmp var
boot dev eth1.route initrd lost+found misc opt root selinux sys usr
相信你的Linux一定是有顏色的,呵呵。
現在回到原來的目錄(剛登陸的時候那個目錄叫用戶主目錄),然後新建一個目錄叫aaa。
QUOTE:
[root@CERNET /]# cd ~
[root@CERNET ~]# mkdir aaa
[root@CERNET aaa]#
~表示用戶的主目錄,mkdir是建立目錄的命令,還可以這樣用
mkdir {aaa,bbb,ccc,ddd} 會同時建立4個目錄
mkdir -p ~/aaa/bbb/ccc/ddd/eee 這樣在前面目錄不存在的時候,會自動建立。
在當前目錄下有這樣的文件,復制和移動是這樣的:
QUOTE:
[root@CERNET /]# ls
a.log
[root@CERNET /]# cp a.log b.log
[root@CERNET /]# ls
a.log b.log
[root@CERNET /]# rm a.log
[root@CERNET /]# ls
b.log
[root@CERNET /]# mkdir dir1
[root@CERNET /]# ls
b.log dir1
[root@CERNET /]# rm -r dir1
b.log
cp是復制文件,rm是刪除文件。cp和rm都有-r的參數,可以復制目錄或者刪除目錄。
刪除時有可能會提示你每個文件都按y確認,可以用-f參數不讓它提示。
-r -f這樣的參數可以寫成-rf。也就是
QUOTE:
[root@CERNET /]# rm -rf dir1
最後看一下設置權限的兩個命令,這通常會給初學者造成很大的困擾,遇到權限不足錯誤的時候,應該看一下是不是權限的問題。
先列出完整的文件列表:
QUOTE:
[root@CERNET /]# ll
total 176
drwxr-xr-x 2 root root 4096 Apr 12 04:02 bin
drwxr-xr-x 3 root root 4096 Apr 3 15:47 boot
drwxr-xr-x 4 root root 4096 Apr 27 00:34 data
drwxr-xr-x 8 root root 5180 Jun 27 13:51 dev
drwxr-xr-x 76 root root 12288 Aug 13 04:03 etc
-rw-r--r-- 1 root root 176 Apr 4 14:17 eth1.route
drwxr-xr-x 2 root root 4096 Aug 13 2004 home
drwxr-xr-x 2 root root 4096 Aug 13 2004 initrd
drwxr-xr-x 11 root root 4096 Apr 4 04:04 lib
drwx------ 2 root root 16384 Apr 3 23:45 lost+found
drwxr-xr-x 2 root root 4096 Aug 13 2004 media
drwxr-xr-x 2 root root 4096 Dec 2 2005 misc
drwxr-xr-x 2 root root 4096 Aug 13 2004 mnt
drwxr-xr-x 5 root root 4096 Aug 9 00:27 opt
dr-xr-xr-x 191 root root 0 Jun 27 21:50 proc
drwxr-x--- 12 root root 4096 Aug 12 09:02 root
drwxr-xr-x 2 root root 12288 Apr 4 04:05 sbin
drwxr-xr-x 2 root root 4096 Apr 3 15:46 selinux
drwxr-xr-x 2 root root 4096 Aug 13 2004 srv
drwxr-xr-x 9 root root 0 Jun 27 21:50 sys
drwxrwxrwt 4 root root 4096 Aug 14 22:16 tmp
drwxr-xr-x 14 root root 4096 Apr 3 15:47 usr
drwxr-xr-x 22 root root 4096 May 17 16:08 var
ll命令是RedHat系列一般都有的一個別名,它代表ls -l。每一行是一個文件或者目錄,就這一行說明一下:
QUOTE:
drwxr-xr-x 14 root root 4096 Apr 3 15:47 usr
drwxr-xr-x 表示:目錄 所有者有rwx權限 所有組有r-x權限 其他用戶有r-x權限
root root 表示:所有者是root,所有組是root。(前面的是用戶,後面的是組)
4096是大小,目錄的大小和文件系統有關系,文件的話,大小就是文件真實的大小。
現在看看修改權限:
QUOTE:
[root@CERNET aaa]# ls -l
drwxr-xr-x 2 root root 4096 Apr 3 15:46 bbb
drwxr-xr-x 2 root root 4096 Aug 13 2004 ccc
[root@CERNET aaa]# chown FTP:ftp bbb
[root@CERNET aaa]# ls -l
drwxr-xr-x 2 ftp ftp 4096 Apr 3 15:46 bbb
drwxr-xr-x 2 root root 4096 Aug 13 2004 ccc
[root@CERNET aaa]# chmod -R 777 bbb
drwxr-xr-x 2 ftp ftp 4096 Apr 3 15:46 bbb
drwxrwxrwx 2 root root 4096 Aug 13 2004 ccc
4 管道 和 高級一些的命令 grep less more sed awk
常用的命令還有很多,在後面有沒見過的命令,我會隨時說明。
現在說一些主要用作配合別的命令的命令。
管道
配合別的文件操作的這類命令一般是這樣工作的:前一個程序的輸出結果,是後一個程序的輸入。這樣銜接起來,可以實現一個很長的串完成復雜的工作。
*nix的設計概念就是這樣的,每個工具完成很簡單的工作,都使用文本做輸入輸出。還有就是關鍵的“管道”,這就可以串起來了。
比如:
QUOTE:
[root@CERNET log]# cat /var/log/dmesg
這個命令會把/var/log/dmesg顯示在屏幕上。但是這個文件裡面是系統的日志,非常得多,幾百行一個屏幕放不下。所以這樣:
QUOTE:
[root@CERNET log]# cat /var/log/dmesg less
自己動手實驗看看效果吧,這個很重要。
QUOTE:
[root@CERNET log]# cat /var/log/dmesg more
也是可以分屏顯示的,區別是less可以上下的滾動,more只能整屏的向後翻。
QUOTE:
[root@CERNET log]# cat /var/log/dmesg grep ACPI
這會把包含“ACPI”的行,都顯示出來,不包含的不顯示。這就是grep的作用。
上面的這個結果,不用管道也可以:
QUOTE:
[root@CERNET log]# grep ACPI /var/log/dmesg
grep有-v的參數,可以把不符合條件的都顯示出來。自己試驗一下吧。
-c的參數可以把符合條件和行數數出來。
awk和sed是稍復雜一些的命令,有很多高級的用法,本文只對初學者,所以只舉兩個例子說一下最簡單的用途。
QUOTE:
[root@CERNET log]# cat /etc/passwd awk -F: '{print $1}'
這會把/etc/passwd這個文件每一行按冒號分割,輸出第一個部分。
QUOTE:
[root@CERNET log]# sed -i 's/aaa/bbb/' test
這會把test文件裡面,所有的aaa字符替換成bbb。sed -i的含義是直接在文件裡替換。沒有-i的參數,它會把替換過的結果輸出到屏幕上。
*學用Linux命令有兩個方面下手:一個是命令本身的參數,一個是如何把命令結合的更好。
命令本身的參數要用幫助慢慢學,man是系統幫助命令。比如
QUOTE:
[root@CERNET log]# man grep
可以顯示出grep命令的幫助。有些版本的Linux這個幫助是中文的。
至於如何結合好不同的命令,就要看自己的理解了。
5 常用的編輯器 vi nano emacs為了把一個些常用的命令放在一起執行,可以寫一個文件,把命令都放在一起,可以通過一個命令執行很多命令。為了下一節做准備,先來學習一下編輯器。nano最簡單,類似Windows的操作方式,啟動以後通過Ctrl+一個鍵執行一些命令。vi有插入模式和改寫模式,用Insert鍵操作。按ESC退出這兩個模式。冒號w可以保存文件。冒號q可以退出。當然也可以寫在一起,用:wq退出。如果要不保存退出,用:q! 點擊查看大圖
emacs更適合做程序開發,因為最初是為了做成一個Shell,所以功能十分復雜。編輯之後,用Ctrl+C+X退出。vi和emacs一直是最受爭議的兩個編輯器,兩者都有各自的特點,各自的忠實用戶。這兩者的選擇完全是個人喜好。初學者從nano用起也不錯,功能稍弱一些,但是至少不至於連退出都不會。
6 編寫自己的腳本好了!開始編寫一個自己的bash腳本文件,執行通常的操作。每次開機都要在桌面上點開lumaQQ,Firefox,Gaim是不是很累?寫個腳本,一起執行!
QUOTE: vi first.sh按Insert進入插入模式,輸入代碼:#!/bin/bashPATH=~/bin/LumaQQ:${PATH}lumaqq &firefox &gaim &點擊查看大圖
QUOTE: 然後按ESC鍵,輸入:wq退出。QUOTE: 看看文件屬性:用ll first.sh給文件加上可執行屬性:用chmod +x first.sh執行這個腳本:./first.sh
點擊查看大圖之後,lumaqq firefox gaim就都打開了!上面的例子中有一些需要解釋的:PATH是執行程序尋找的路徑,在這個路徑下的程序,可以只輸入名字就能運行。比如我們剛才用過的chmod,它其實就是這個文件/bin/chmod。因為PATH環境變量包括/bin,所以可以直接使用。對於PATH中不包括的地方的程序,就要寫全路徑來執行,比如./first.sh就是執行當前目錄下的first.sh文件。被執行的程序都必須有可執行的權限才可以。first.sh文件的第一行是一個標志。因為實際上電腦只能執行編譯過的二進制文件,對這種用文本寫的文件,需要有一個二進制文件來進行解釋,然後執行。如果沒有這句的話,也可以這樣運行:
QUOTE: [root@localhost ~]# /bin/bash first.sh
&符號表示這個程序在後台運行,這樣可以在一個腳本裡並行啟動多個程序。類似的操作還有Ctrl+Z,可以把前台運行的程序放到後台休眠起來,用bg命令讓它在後台繼續執行,用fg命令讓它回到前台。
7 自動運行crontabLinux有一個服務叫做Crond,用來定時地完成一定的操作。這個功能在桌面應用可能不是很多,但是依然是一個十分有趣的功能,值得了解一下。
QUOTE: [root@localhost ~]# crontab -e可以打開一個vi編輯器,裡面包含當前用戶的計劃表。格式是這樣的:
QUOTE: 1 2 3 * * /root/second.sh > /root/second.log 2>&1 &前面5個表示的就是運行的時間
QUOTE: 1 2 3 * *表示每月3日的2點1分 執行後面的語句*/15 * * * * 表示每15分鐘執行一次(有的舊版本crond不支持/,就要寫成0,15,45 * * * *)1 1 * * 1 表示每周一運行(也有用0表示周一,要man crond)一直沒有變的那個*,呵呵,表示年,一般沒人計劃一年的事啦。QUOTE: [root@localhost ~]# crontab -l
可以列出來當前的計劃表。上面的命令有兩個地方需要說明:>符號表示把運行的結果保存在後面的文件裡。因為是自動運行嘛,根本沒有一個屏幕供顯示結果,所以一般在crontab裡面都會保存一個運行結果。>>符號可以用“追加”模式,將新的結果寫在原有文件後面。2>&1的意思是把錯誤輸出也同時輸出到標准輸出。
可以列出來當前的計劃表。上面的命令有兩個地方需要說明:>符號表示把運行的結果保存在後面的文件裡。因為是自動運行嘛,根本沒有一個屏幕供顯示結果,所以一般在crontab裡面都會保存一個運行結果。>>符號可以用“追加”模式,將新的結果寫在原有文件後面。2>&1的意思是把錯誤輸出也同時輸出到標准輸出。
可以列出來當前的計劃表。上面的命令有兩個地方需要說明:>符號表示把運行的結果保存在後面的文件裡。因為是自動運行嘛,根本沒有一個屏幕供顯示結果,所以一般在crontab裡面都會保存一個運行結果。>>符號可以用“追加”模式,將新的結果寫在原有文件後面。2>&1的意思是把錯誤輸出也同時輸出到標准輸出。