Linux shell程序設計(一).基本操作
?
??? 今天開始來系統得學習一下Linux中的shell編程操作。這部分的內容,說簡單也簡單,但是主要是要多應用,每次看到不同的寫法會有不同的領悟,要精通是很不容易的。可是用一些簡單的結構寫出很復雜的過程來。好了,今天先來學習一點基本的操作。
?
?
一、Shell概述
?
1、Shell的種類
?
??? ① sh (Bourne shell):shell的基礎版本,編程方面優秀,但交互性方面不好。
??? ② csh (C shell):語法與C類似,交互性更好,但與sh不兼容
??? ③ ksh (Korn shell):集合sh和csh有點,并兼容sh
??? ④ bash(Bourne Again shell):默認shell,集合csh和ksh有點,但與sh不兼容
???
⑤ 其他:如ash、zsh等
?
??? 主要介紹bash的用法,bash主要繼承了csh和ksh的以下優點:
?
??? * 命令行歷史 (翻閱歷史命令)
??? * 命令行編輯 (可用vi修改已輸命令)
??? * 命令補全 (Tab)
??? * 別名擴展 (建立代表某些命令的名字)
?
2、Shell的特點
?
??? ① 可建立腳本來組合命令
??? ② 提供了文件名擴展字符(*/?/[])
??? ③ 可直接使用shell內置命令而無需創建新進程
??? ④ 靈活的數據流:通配符、輸入/出重定向、管道線等
??? ⑤ 結構化的程序模塊:順序、條件、循環
??? ⑥ 后臺執行命令能力:&
??? ⑦ 提供可配置環境,用戶可創建、修改命令
??? ⑧ 提供高級語言命令,可制作shell腳本
?
3、shell程序示例
?
??? ① 使用shell最簡單的方法就是直接輸入命令,如:
???
??? $ ls -l /usr
?
??? ② 簡單shell腳本
?
??? $ cat ex1
??? date
??? pwd
??? cd ..
?
??? 這個腳本表示依次執行腳本中的命令
??? 先顯示出日期,再顯示當前工作目錄,再返回上級目錄
?
??? ③ 帶控制結構的腳本
?
??? #!/bin/bash
??? # If no arguments then listing the current directory.
??? # Otherwise listing each subdirectory.
?
??? if test $# = 0
??? then ls
??? else
????? for? i
????? do
??????? ls -l $i|grep '^d'
??????? done
??? fi
?
??? 說明:
??? 1) #!/bin/bash 表示下面的腳本用bash編寫,必須用bash進行解釋執行
??? 2) #開頭的行為注釋行
??? 3) if下面的for循環語句結構
?
4、Shell腳本的執行
?
??? ① 輸入定向到shell腳本
??? $ bash < ex1
?
??? shell從文件ex1讀取命令并執行,執行完成后返回shell命令狀態,此命令不能帶參數。
?
??? ② 以腳本名作為bash參數
??? $ bash ex2
??? $ . ex2
?
??? 這種方法可以在后面加參數
??? 第二行的“. ex2”表示用當前shell執行該腳本,注意中間要有空格
?
??? ③ 將shell腳本權限設為可執行
??? $ chmod a+x ex2
??? $ ex2
?
??? 可以將shell腳本所在目錄加入到命令搜索目錄,這樣可以像普通命令那樣隨時調用。
?
?
二、命令歷史
?
??? bash為每個用戶都維護了一個命令歷史文件:~/.bash_history
?
1、顯示歷史命令
?
??? ① 不帶參數
??? $ history
?
??? 列出所有的命令,并附有編號。所有命令均是曾經被執行過的。
?
??? ② 后面帶數字
??? $ history 50
?
??? 表示列出最后的50條命令
?
??? ③ 刪除所有信息
??? $ history -c
?
2、執行歷史命令
?
??? ① 基本操作
??? $ !50
?
??? 執行序號為50的命令
?
?? ② 其他操作
?
??? !!???????? 重復執行上一條命令,即!-1
??? !n???????? 重新執行第n條命令
??? !-n??????? 重新執行倒數第n條命令
?? !string??? 重新執行最近一條以string開頭的命令
?? !?string?? 重新執行最近一條包含string的命令
??? !#???????? 執行到現在為止所輸入的整個命令行
?
3、配置歷史命令環境
?
??? ① 更改文件路徑
??? $ HISTFILE="/home/wxq/.myhistory"
?
??? 通過更改環境變量HISTFILE來改變存放歷史命令的文件
?
?? ② 改變記錄個數
??? $ HISTSIZE=600
?
?
三、名稱補全
?
??? 在輸入文件名時,使用Tab鍵,會自動進行名稱補全
?
??? ① 當系統可以唯一確定是哪個目錄或文件時,自動補全
??? ② 當系統找到不止一個文件名時,把文件名補全到最后一個相同的字符為止
??? ③ 若不能唯一確認時,盡量補全并響鈴提示
?
??? 注:可以按兩次Tab鍵(或Esc+?),使系統自動提示所有可以匹配的文件。
?
?
四、別名
?
??? ① 創建別名
?
??? bash可以用alias命令來定義別名。例如:
??? $ alias ..='cd ..'
??? $ alias cp='cp -i'
??? $ alias ll='ls -l'
?
??? 注意:“=”兩邊不能有空格,如果命令中間有空格,需要用單引號括起來。
?
??? ② 刪除別名
??? $ unalias ll
?
?
??? 可以通過一下命令刪除所有的別名:
??? $ unalias -a
?
?