[本文是自己學習所做筆記,歡迎轉載,但請註明出處:http://blog.csdn.net/jesson20121020]
Shell腳本基本元素:
#!/bin/bash
--- 第一行
#
--- 註釋
變量
流程控制結構
看一個簡單的例子,學任何語言,我想大多數情況下都是從helloworld程序開始的,shell也是一門語言,我們也從helloworld開始。
新建一個名爲helloworld.sh的文件,在裏面寫入:
helloworld.sh
#!/bin/sh
#這是一個很簡單的打印“hello world”的shell腳本
echo "hello world!"
要執行這樣一個簡單的腳本,首先我們要給該文件可執行的權限。如下:
chmod u+x helloworld.sh
./helloworld.sh
hello world!
可以看出,通過這樣一個簡單的腳本就可以將“hello world”打印到屏幕上。
Shell特性:
一般而言,shell腳本有以下特性:
1) 別名
2) 命令替換
3) 後臺處理
4) 變量
5) 管道
6) 重定向
7) 模式匹配
8) 特殊字符
下面挨個介紹:
1) 別名
可以通過alias查看當前系統的別名,如我的系統別名如下:
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
也可以自定義別名,如:
jesson@jesson-HP:~$ alias lh='ls -lh'
jesson@jesson-HP:~$ lh
總用量 40K
drwxr-xr-x 2 jesson jesson 4.0K 12月 18 09:47 Desktop
drwx------ 4 jesson jesson 4.0K 12月 2 20:29 develop
drwxr-xr-x 8 jesson jesson 4.0K 12月 16 11:27 iNodeClient
drwxr-xr-x 2 jesson jesson 4.0K 12月 6 19:30 公共的
drwxr-xr-x 2 jesson jesson 4.0K 12月 6 19:30 模板
drwxr-xr-x 2 jesson jesson 4.0K 12月 6 19:30 視頻
drwxr-xr-x 3 jesson jesson 4.0K 12月 16 14:51 圖片
drwxr-xr-x 9 jesson jesson 4.0K 1月 15 20:22 文檔
drwxr-xr-x 6 jesson jesson 4.0K 1月 15 20:45 下載
drwxr-xr-x 2 jesson jesson 4.0K 12月 6 19:30 音樂
既然可以自定義別名,當然,也可以取消別名,其實很簡單,直接輸入unalias 別名 即可。
2) 命令替換
直接看這樣一個命令
jesson@jesson-HP:~$ ls -l `cat /etc/shells`
-rwxr-xr-x 1 root root 920788 3月 29 2013 /bin/bash
-rwxr-xr-x 1 root root 100284 3月 30 2012 /bin/dash
lrwxrwxrwx 1 root root 4 12月 6 19:10 /bin/rbash -> bash
lrwxrwxrwx 1 root root 4 12月 6 19:10 /bin/sh -> dash
可以看出,命令的結果是列出當前系統存在的shell。其實,執行過程是這樣的,先執行` `中的命令,執行結果如下:
jesson@jesson-HP:~$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
這個命令的執行結果打印出該文件的內容,然後,再執行ls -l 輸出的每行 ,這樣就按行列出所有的shell的詳細信息,其實在命令中加入` `的作用就是命令替換。
3) 後臺處理
一個終端可以同時運行多個後臺程序。
用法: nohup command &
可以用jobs 查看當前的後臺程序。
4) 變量
變量是用來存儲信息的。如系統變量SHELL,PATH等,當然了也以自己定義變量了。
5) 管道
管道是把一個命令的輸出連接到另一個命令的輸入。如:
jesson@jesson-HP:~$ ls | sort
Desktop
develop
iNodeClient
公共的
模板
視頻
圖片
文檔
下載
音樂
可以注意到,這是排序後的輸出結果。
6) 重定向
重定向與管道相關,可以改變程序的輸入來源和輸出地點,如
jesson@jesson-K43SV:~/develop/worksapce/shell_workspace$ ls -l >homefile.txt
jesson@jesson-K43SV:~/develop/worksapce/shell_workspace$ ll
總用量 12
drwxrwxr-x 2 jesson jesson 4096 1月 16 00:30 ./
drwxrwxr-x 7 jesson jesson 4096 1月 16 00:28 ../
-rw-rw-r-- 1 jesson jesson 573 1月 16 00:30 homefile.txt
jesson@jesson-K43SV:~/develop/worksapce/shell_workspace$ cat homefile.txt
總用量 40
drwxr-xr-x 2 jesson jesson 4096 1月 11 23:44 Desktop
drwxrwxr-x 4 jesson jesson 4096 1月 12 00:41 develop
drwxr-xr-x 8 jesson jesson 4096 1月 11 21:51 iNodeClient
drwxr-xr-x 2 jesson jesson 4096 1月 11 21:23 公共的
drwxr-xr-x 2 jesson jesson 4096 1月 11 21:23 模板
drwxr-xr-x 2 jesson jesson 4096 1月 11 21:23 視頻
drwxr-xr-x 3 jesson jesson 4096 1月 14 23:26 圖片
drwxr-xr-x 2 jesson jesson 4096 1月 11 22:46 文檔
drwxr-xr-x 5 jesson jesson 4096 1月 16 00:26 下載
drwxr-xr-x 25 jesson jesson 4096 1月 12 00:48 音樂
jesson@jesson-K43SV:~/develop/worksapce/shell_workspace$ sort < homefile.txt > homefile.txt.sort
jesson@jesson-K43SV:~/develop/worksapce/shell_workspace$ ll
總用量 16
drwxrwxr-x 2 jesson jesson 4096 1月 16 00:31 ./
drwxrwxr-x 7 jesson jesson 4096 1月 16 00:28 ../
-rw-rw-r-- 1 jesson jesson 573 1月 16 00:30 homefile.txt
-rw-rw-r-- 1 jesson jesson 573 1月 16 00:31 homefile.txt.sort
jesson@jesson-K43SV:~/develop/worksapce/shell_workspace$ cat homefile.txt.sort
drwxrwxr-x 4 jesson jesson 4096 1月 12 00:41 develop
drwxr-xr-x 25 jesson jesson 4096 1月 12 00:48 音樂
drwxr-xr-x 2 jesson jesson 4096 1月 11 21:23 公共的
drwxr-xr-x 2 jesson jesson 4096 1月 11 21:23 模板
drwxr-xr-x 2 jesson jesson 4096 1月 11 21:23 視頻
drwxr-xr-x 2 jesson jesson 4096 1月 11 22:46 文檔
drwxr-xr-x 2 jesson jesson 4096 1月 11 23:44 Desktop
drwxr-xr-x 3 jesson jesson 4096 1月 14 23:26 圖片
drwxr-xr-x 5 jesson jesson 4096 1月 16 00:26 下載
drwxr-xr-x 8 jesson jesson 4096 1月 11 21:51 iNodeClient
總用量 40
容易看出,利用重定向可以很方便的指定程序的輸入來源和輸出,如上述例子中 sort < homefile.txt > homefile.txt.sort
sort的來源是homefile.txt文件,而輸出也是文件,這裏是homefile.txt.sort.
7) 模式匹配
如顯示以txt爲擴展名或以a開頭的文件,這種能力即稱爲模式匹配,在模式匹配中,一般使用正則表達式。
例如:
jesson@jesson-K43SV:~/develop/worksapce/shell_workspace$ ls -l *.txt
-rw-rw-r-- 1 jesson jesson 573 1月 16 00:30 homefile.txt
8) 特殊字符
雙引號(""): 用來使Shell無法認出空格,製表符和其他大多數特殊字符,這樣“ls -l helloworld.sh” 表示一個值。
單引號(''): 用來使Shell無法認出所有特殊字符。
反引號(``): 用來替換命令。
反斜槓(\): 用來使Shell無法認出其後的特殊字符,使其後的特殊字符失去特殊含義。
分號(;): 允許在一行放置多個命令。
&: 後臺執行。
括號(): 創建成組的命令。
大括號{}: 創建命令塊。
豎杆(|): 管道表示符。
< >: 重定向表示符。
* ? []: 模式匹配符。
$: 變量名的開頭。
#: 註釋
空格,製表符,換行符: 當作空白。