bash的基礎特性:
bash,Unix shell的一種,在1987年由布萊恩·福克斯為了GNU計劃而編寫。1989年釋出第一個正式版本,原先是計劃用在GNU作業系統上,但能運作于大多數類Unix系統的作業系統之上,包括Linux與Mac OS X v10.4都将它作為預設shell。它也被移植到MicrosoftWindows上的Cygwin與MinGW,或是可以在MS-DOS上使用的DJGPP項目。在Novell NetWare與Andriod在上也有移植。1990年後,Chet Ramey成為了主要的維護者。
為Bourne shell的後繼相容版本與開放源代碼版本,它的名稱來自Bourne shell(sh)的一個雙關語(Bourne again /born again):Bourne-AgainSHell。
Shell
GUI:
GNOME
KDE
XFCE
CLI:
狹義上的shell
cat/etc/shells
/bin/bash
/bin/csh
/bintcsh
/bin/bash
終端:ternimal
(1) 指令曆史
history
(2) 指令别名
alias/unalias
(3) 指令補全
(4) 路徑補全
(5) 指令行展開
~, {}
常用的基礎指令:
cd指令:change directory
cd [/PATH/TO/SOMEWHERE]
cd
cd ~: 回主目錄
cd ~USERNAME:切換指定使用者的家目錄
cd -: 回到上一次所在目錄
相關環境變量:
PWD:
OLDPWD:
pwd指令:printing workingdirectory
顯示工作目錄
ls:list
列出指定路徑下的檔案或目錄的屬性資訊
Metadata:屬性資料
data:資料
ls [OPTION]... [FILE]...
-l: 使用長格式顯示
drwxr-xr-x1 root root 8 Aug 23 08:47 .cache
d:檔案類型
rwxr-xr-x:權限,mode
1:檔案被硬連結的次數
root:owner,屬主;
root:group, 屬組
8:size,預設為位元組
Aug23 08:47 修改時間戳
.cache:檔案名
-d:顯示目錄自身屬性
-h:human-readable
-a:顯示所有檔案,包括.開頭的隐藏檔案
.:目前目錄
..:父目錄
-r: reverse,逆序顯示
-R: recusive,遞歸
文本檔案檢視類的指令:
cat, tac指令:
cat[OPTION]... [FILE]...
-n:
-e:-vE
-E:顯示行結束符
-v:顯示非列印字元
檔案内容類型檢視指令:
file /PATH/TO/SOMEWHERE
回顯指令: echo
echo [OPTION]...[ARGS]...
-n: 不進行換行;
-e:讓控制符生效;
\n:new line
echo"$VAR_NAME"
指令路徑位置檢視工具:
whereis, which
which:
which[options] [--] programname [...]
--skip-alias:禁止列出别名
whereis COMMAND:
顯示二進制程式、源碼檔案以及幫助手冊的路徑;
時間相關的指令:
RTC:RealTime Clock
System Clock:系統時鐘
date: 系統時間
clock, hwclock: 硬體時間
date:
date[OPTION]... [+FORMAT]:時間顯示
FORMAT
%F
%D
%T
%H
%M
%S
date[MMDDhhmm[[CC]YY][.ss]]:時間設定
hwclock
-s:hctosys, 以硬體時鐘為準,調整系統時間同硬體;
-w:systohc, 以系統時鐘為準
cal:
cal[YEAR]
關機或重新開機
關機:halt, poweroff,init 0, shutdown -h TIME
重新開機:reboot, init 6,shutdown -r TIME
shutdown
shutdown[OPTIONS...] [TIME] [WALL...]
-r:重新開機
-h:關機
--no-wall
-c
TIME:
+m:相對時長之後執行相應操作;機關是分鐘;
HH:MM絕對時間
stat:
w,who, whoami
bash的基礎特性(02)
(1) glob
文本名“通配”
*:比對任意長度的任意字元;
?:比對任意單個字元;
a*b:aab, ab, a123b;
a?b:
[]: 比對指定範圍内的任意單個字元;
[0-9]
[^]:比對範圍外的任意單個字元;
[^a-b]
字元集合:
[:lower:]
[:upper:]
[:alnum:]
[:digit:]
[:space:]
[:punct:]
練習:
顯示/etc/目錄下,以非字母開頭,後面跟了一具字母及其它任意長度任意字元的檔案或目錄;
複制/etc目錄下,所有以.d結尾的檔案或目錄至/tmp/mageedu.com目錄中;
(2) 組合鍵
Ctrl+l:清屏
Ctrl+a: 切換至指令行首
Ctrl+e:切換至指令行尾
Ctrl+c:取消指令執行
Ctrl+u:删除光标所在處至行首的内容;
Ctrl+k: 删除光标所在處至行尾的内容;
(3) IO重定向和管道
程式:指令+資料
讀入資料:Input
輸出資料:Output
打開的檔案都一個fd:file descriptor
标準輸入:keyboard, 0,/dev/stdin
标準輸出:monitor, 1,/dev/stdout
标準錯誤輸出:monitor, 2,/dev/stderr
I/O重定向:
輸入重定向
輸出重定向:
COMMAND> NEW_POS, COMMAND >> NEW_POS
>:覆寫重定向;
>>:追加重定向;
set-C
如果覆寫重定向目标檔案存在,則禁止執行;
>|
set+C
錯誤重定向:
2>:覆寫
2>>:追加
同時重定向标準輸出流和錯誤輸出流:
COMMAND >/path/to/file.out 2> /path/to/file.err
COMMAND >/path/to/file.out 2>&1
COMMAND&> /path/to/file.out
輸入重定向:
<
tr指令:
tr[OPTION]... SET1 [SET2]
-d:删除字元
Here Document:<<
cat >>/path/to/somefile << EOF
管道:
COMMAND1 | COMMAND2 | ...
練習:tee指令的用法;
使用整數[編輯]
與Bourne shell不同的是bash不用另外生成程序即能進行整數運算。bash使用((...))指令和$[...]變量文法來達到這個目的:
VAR=55 # 将整數55指派給變量VAR
((VAR = VAR + 1)) # 變量VAR加1。注意這裡沒有'$'
((++VAR)) # 另一種方法給VAR加1。使用C語言風格的字首自增
((VAR++)) # 另一種方法給VAR加1。使用C語言風格的字尾自增
echo $((VAR * 22)) # VAR乘以22并将結果送入指令
echo $[VAR * 22] # 同上,但為過時用法
((...))指令可以用于條件語句,因為它的退出狀态是0或者非0(大多數情況下是1),可以用于是與非的條件判斷:
if((VAR == Y * 3 + X * 2))
then
echo Yes
fi
((Z > 23)) && echo Yes
((...))指令支援下列比較操作符:'==', '!=','>', '<', '>=',和'<='。
bash不能在自身程序内進行浮點數運算。目前有這個能力的unix shell隻有Korn shell和Z shell。
輸入輸出重定向[編輯]
bash擁有傳統Bourne shell缺乏的I/O重定向文法。bash可以同時重定向标準輸出和标準錯誤,這需要使用下面的文法:
command &> file
這比等價的Bourne shell文法"command> file 2>&1"來的簡單。2.05b版本以後,bash可以用下列文法重定向标準輸入至字元串(稱為here string):
command <<< "string to be readas standard input"
如果字元串包括空格就需要用引号包裹字元串。
例子: 重定向标準輸出至檔案,寫資料,關閉檔案,重置标準輸出。
# 生成标準輸出(檔案描述符1)的拷貝檔案描述符6
exec 6>&1
# 打開檔案"test.data"以供寫入
exec 1>test.data
# 産生一些内容
echo "data:data:data"
# 關閉檔案"test.data"
exec 1>&-
# 使标準輸出指向FD 6(重置标準輸出)
exec 1>&6
# 關閉FD6
exec 6>&-
打開及關閉檔案
# 打開檔案test.data以供讀取
exec 6<test.data
# 讀檔案直到檔案尾
while read -u 6 dta
do
echo "$dta"
done
# 關閉檔案test.data
exec 6<&-
抓取外部指令的輸出
# 運作'find'并且将結果存于VAR
# 搜尋以"h"結尾的檔案名
VAR=$(find . -name "*h")
程序内的正規表達式[編輯]
bash3.0支援程序内的正規表達式,使用下面的文法:
[[ string =~ regex ]]
正規表達式文法同regex(7) man page所描述的一緻。正規表達式比對字元串時上述指令的退出狀态為0,不比對為1。正規表達式中用圓括号括起的子表達式可以通路shell變量BASH_REMATCH,如下:
if [[ abcfoobarbletch =~ 'foo(bar)bl(.*)' ]]
echo The regex matches!
echo $BASH_REMATCH -- outputs: foobarbletch
echo ${BASH_REMATCH[1]} -- outputs:bar
echo ${BASH_REMATCH[2]} -- outputs:etch