bash的基礎特性:git
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
Shellbash
GUI:ide
GNOME工具
KDEspa
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:]
[:alnum:]
練習:
顯示/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(.*)' ]]
then
echo The regex matches!
echo $BASH_REMATCH -- outputs: foobarbletch
echo ${BASH_REMATCH[1]} -- outputs:bar
echo ${BASH_REMATCH[2]} -- outputs:etch
fi