#!bash 井號是起注釋作用的
rm -f xxx f是強制移除的意思
ps 是顯示當前前台進程狀態
ps -e 是顯示當前所有進程狀態(前台和後台全部都在)
ls -l 是顯示目前的目錄下所有檔案的讀寫權限
剛剛創立的shell指令碼是不能執行的,有兩種方式可以執行,
1. 使用shell工具進行解析
sh xxx.sh
2. 修改指令碼的許可權,一般使用755比較多
chmod 755 xxx.sh
cat命令也用的比較多,用來在終端顯示檔案的內容,對於比較短的指令碼比較適合。
簡單的指令碼
while true #迴圈判斷,在目前狀態下是沒有終止條件的,相當於是一個死迴圈<br />do<br /> date; #查詢當前日期<br /> sleep 1; #讓電腦休眠一秒<br />done
變數
shell有兩種變數,環境變數和臨時變數。環境變數是永久性變數,其值不會隨著shell執行過程的結束而結束,會以最新動向的值儲存下來。而臨時變數是shell內部程式定義的,它的使用範圍僅限於定義它的程式,出了本程式就不能再使用了。
工具:echo命令,用來回顯後面的字串
環境變數:
echo $PATH<br />echo $HOME<br />echo $HOSTNAME<br />echo $LOGNAME
1. PATH,路徑的環境變數,指的是當前系統提供的程式執行的路徑。會顯示程式的執行路徑。
2. HOME,顯示目前使用者所屬的家路徑。
3. HOSTNAME(顯示當前的主機名稱)
4. LOGNAME,顯示當前shell終端的使用者登入名稱
如何修改環境變數呢
我們使用export命令來對環境變數進行添加和充實
pandachow@pandachow:~$ echo $PATH<br />/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games<br />pandachow@pandachow:~$ export PATH=/home/pandachow:$PATH<br />pandachow@pandachow:~$ echo $PATH<br />/home/pandachow:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games<br />
注意幾點,此處添加的路徑為/home/pandachow,需要在後面添加冒號,意思為將添加的路徑加原來的PATH變數的中,再一起賦給PATH。我們使用echo可以看到PATH變數已經成功修改了。
下面是臨時變數,也就是使用者自訂的變數,這種變數的一般命名和賦值的形式是:變數名=字串
pandachow@pandachow:~/workspace/test$ myfile=/home/pandachow/workspace/test/matrix.cpp<br />pandachow@pandachow:~/workspace/test$ echo $myfile<br />/home/pandachow/workspace/test/matrix.cpp<br />
上面的例子中,可以看到,開始將/home/.../matrix.cpp這個字串(也就是路徑)賦給了myfile這個變數名,當然是我們的自訂變數。然後再echo $myfile的時候,就看到了該檔案的路徑名。
在shell中的輸入/輸出可以使用read命令來由標準輸入讀取資料,然後賦給指定變數。一般格式為:
read 變數1 [變數2].......
shell中的特殊字元,shell裡除使用一般字元意外,還會使用一些特殊字元,他們都有一些特殊的含義,在使用的時候需要注意他們表示的意義和作用範圍。
1. 萬用字元,萬用字元主要用於模式比對。例如檔案名稱匹配,路徑名搜尋,字串尋找等等。
2. 引號,引號分為單引號和雙引號。雙引號裡面除了$, / 和倒引號仍然保留其特殊用途 ,其餘字元均視為一般字元串。單引號裡面所有的字元都視作一般字元串。
輸入輸出重新導向
1. 輸入重新導向,輸入重新導向(<) 是指將檔案的內容輸出到電腦螢幕上,也就是顯示在終端裡。
2. 輸出重新導向,輸出重新導向( >) 是指將一個命令(或可執行程式)的標準輸出重新導向到指定檔案。這樣改命令的輸出結果就不在螢幕上顯示,而是寫入指定的檔案中。上面的例子中,可以看到,開始將/home/.../matrix.cpp這個字串(也就是路徑)賦給了myfile這個變數名,當然是我們的自訂變數。然後再echo $myfile的時候,就看到了該檔案的路徑名。
pandachow@pandachow:~/workspace/test$ who >abc<br />pandachow@pandachow:~/workspace/test$ ls<br />pandachow@pandachow:~/workspace/test$ cat abc<br />pandachow tty7 2011-02-18 02:19 (:0)<br />pandachow pts/0 2011-02-18 03:16 (:0.0)<br />
在上面的例子中,可以看到,命令who的結果並沒有顯示在終端裡,而是被寫入一個abc檔案(這個檔案可以事先不存在,執行輸出重新導向的時候系統自動建立),cat這個abc檔案之後,可以看到who的結果已經被寫入了abc這個檔案當中。
注釋,管道和後台命令
1. 注釋。如前面所介紹的,shell程式中的注釋使用#號。
2. 管道線。在Linux中,管道是用豎杠(|)來隔開若干個命令組成的序列,例如
pandachow@pandachow:~$ ls<br />a.sh Desktop Downloads Music Public Selection_001.png Templates Videos writing<br />Azureus Downloads Documents examples.desktop Pictures robocup simspark texmf workspace<br />pandachow@pandachow:~$ ls -l<br />total 156<br />-rw-r--r-- 1 root root 43 2011-02-18 13:09 a.sh<br />drwxr-xr-x 3 pandachow pandachow 4096 2011-02-10 17:11 Azureus Downloads<br />drwxr-xr-x 2 pandachow pandachow 4096 2011-02-16 01:03 Desktop<br />drwxr-xr-x 6 pandachow pandachow 4096 2011-02-11 17:10 Documents<br />drwxr-xr-x 14 pandachow pandachow 4096 2011-02-18 13:16 Downloads<br />-rw-r--r-- 1 pandachow pandachow 179 2010-12-03 15:26 examples.desktop<br />drwxr-xr-x 2 pandachow pandachow 4096 2010-12-03 17:45 Music<br />drwxr-xr-x 3 pandachow pandachow 4096 2011-02-18 13:15 Pictures<br />drwxr-xr-x 2 pandachow pandachow 4096 2010-12-03 17:45 Public<br />drwx------ 14 pandachow root 4096 2011-02-16 20:15 robocup<br />-rw-r--r-- 1 pandachow pandachow 92986 2011-02-18 14:37 Selection_001.png<br />drwxr-xr-x 6 root root 4096 2010-12-31 12:25 simspark<br />drwxr-xr-x 2 pandachow pandachow 4096 2010-12-03 17:45 Templates<br />drwxr-xr-x 4 pandachow pandachow 4096 2011-01-19 00:44 texmf<br />drwxr-xr-x 6 pandachow pandachow 4096 2011-02-10 17:58 Videos<br />drwxr-xr-x 5 pandachow pandachow 4096 2011-01-11 17:48 workspace<br />-rw-r--r-- 1 pandachow pandachow 39 2011-02-15 21:57 writing<br />pandachow@pandachow:~$ ls $HOME |wc -l<br />17<br />pandachow@pandachow:~$ ls -l $HOME |wc -l<br />18<br />
前面是ls -l $HOME,等同於:ls -l /home/pandachow,因此是列出/home/pandachow/這個目錄下的所有檔案名稱,並顯示他們的許可權,管道線後面跟著的是wc -l,這個是顯示文本行數,在列出檔案名稱之後使用這個命令就是列出目前的目錄下檔案的數目+1,這裡顯示18個是已經包括了一個前面統計的total 156這一行。
再舉一個例子
例如我想查看現在進程中有沒有播放器開啟的,假設播放器都叫XXplayer,或者說名字裡都帶有player這個關鍵詞。
pandachow@pandachow:~$ ps -e | grep player<br />28071 ? 00:02:05 smplayer<br />28074 ? 00:06:05 mplayer<br />
我們使用ps -e來顯示當前所有的進程名(ps -f, 能顯示進程的調用路徑),管道線之後是用grep命令來進行名稱過濾,只提取出名字裡含有player的。前面會顯示它的pid進程號,如果我們想關閉某個命令,可以在終端輸入kill+進程號,例如:
kill 28071
即可關閉剛才的smplayer進程。
管道命令中,有一類又叫做過濾器,好比從前一個命令中得到輸入,使用這個命令之後再輸出結果,類似過濾的效果。這樣的命令常用的有:grep,tail,sort和wc等。
一個管道線也會有多個命令
ls | grep m?.cpp | wc -l #這條管道命令來顯示目前的目錄下所有2個字母,而且第一個字母是m,尾碼是cpp的檔案的數目,特別注意,這裡?只能代表一個字元,如果是多個字元,要是用*來通配<br />ls | grep m*.cpp | wc -l
後台命令
有時候,我們不希望在前台看到命令的執行過程,可以在一條命令的末尾加上&符號,可以實現命令後台運行。
//=====================前台模式=====================<br />pandachow@pandachow:~$ while true; do date; sleep 1; done<br />Fri Feb 18 16:27:49 CST 2011<br />Fri Feb 18 16:27:50 CST 2011<br />Fri Feb 18 16:27:51 CST 2011<br />^C<br />//======================下面是後台===================<br />pandachow@pandachow:~$ while true; do date; sleep 1; done&<br />[1] 31813<br />pandachow@pandachow:~$ Fri Feb 18 16:28:42 CST 2011<br />Fri Feb 18 16:28:43 CST 2011<br />Fri Feb 18 16:28:44 CST 2011<br />
前台模式中,雖然程式在運行,但是這時候我們並不是執行其他命令,只能用強制結束它之後才能繼續使用。
後台模式中,程式在後台運行,因此系統在執行建立進程的時候,在終端上顯示這個這個進程的PID,方便我們控制。因此類似這樣的一個沒有內建終止條件的程式是很危險的,因為他會在後台運行,但是我們卻又不能直接控制它,此時,仍然可以在終端裡輸入其他命令,只不過會被這個背景輸出打斷。因此我們使用kill+進程號來終止這個進程。