Bash的基礎特性:history命令git
命令歷史:shell進程會其會話中保存此前用戶提交執行過的命令;算法
[root@centos7 ~]# historyshell
定製history的功能,可經過環境變量實現:編程
HISTSIZE:shell進程可保留的命令歷史條數centos
[root@centos7 ~]# echo $HISTSIZE緩存
1000bash
HISTFILE:歷史命令保存的文件數據結構
[root@centos7 ~]# echo $HISTFILE編程語言
/root/.bash_historyide
HISTFILESIZE:歷史命令文件的大小
[root@centos7 ~]# echo $HISTFILESIZE
1000
命令用法:
history [-c] [-d 偏移量] [n]
或 history -anrw [文件名]
或 history -ps 參數 [參數...]
選項:
-d:刪除指定某條歷史命令
[root@centos7 ~]# history -d 347
[root@centos7 ~]# history -d 347 5(加入5的意思是從347條開始向後刪除5條)
-c:清空命令歷史
[root@centos7 ~]# history -c
-w:從內存歷史命令中保存到文件
-r:從文件歷史命令讀取到內存中
history #:顯示最近的#條命令;
調用命令歷史列表中的命令:
[root@centos7 ~]# !#:再一次執行歷史列表中的第#條命令;
[root@centos7 ~]# !!:再一次執行上一條命令;
[root@centos7 ~]# !STRING:再一次執行歷史命令中最近一個以string開頭命令;
~]# !tail
調用上一條命令的最後一個參數:
1.ESC+.(點號):會補全最後一個參數
2.!$:會補全最後一個參數
[root@centos7 ~]# ll /etc/sysconfig/network-scripts/ifcfg-eno16777736
[root@centos7 ~]# cat 按鍵(esc,.)
[root@centos7 ~]# file !$
file /etc/sysconfig/network-scripts/ifcfg-eno16777736
/etc/sysconfig/network-scripts/ifcfg-eno16777736: ASCII text
控制命令歷史記錄的方式:
環境變量:HISTCONTROL
[root@centos7 ~]# echo $HISTCONTROL
ignoredups:忽略重複的命令;
ignorespace:忽略以空白字符開頭的命令;
ignoreboth:以上二者同時生效;
修改變量的值:
NAME='VALUE'
HISTCONTROL=ignorespace
Bash的基礎特性:命令/路徑補全
命令補全:
shell程序在接收到用戶執行命令的請求,分析完成以後,最左側的字符串會被看成命令;
命令查找機制:
1.查找內部命令;
2.根據PATH環境變量中設定的目錄,自左而右逐個搜索目錄下的文件名;
[root@centos7 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
給定的打頭字符串若是能惟一標識某命令程序文件,則直接補全;
[root@centos7 ~]# ifcon(鍵入到此點擊「Tab」鍵會自動補全ifconfig命令)
給定的打頭字符串若是不能惟一標識某命令程序文件,再擊tab鍵一次,會給出列表;
[root@centos7 ~]# if(鍵入到此雙擊「Tab」鍵,因爲不是惟一標識會返回關於if命令列表)
if ifcfg ifconfig ifdown ifenslave ifnames ifstat ifup
路徑補全:
在給定的起始路徑下,以對應路徑下的打頭字串來逐一匹配起始路徑下的每一個文件:
tab鍵:
若是能唯一標識,則直接補全;
不然,再一次tab,給出列表;
Bash的基礎特性之:命令行展開
~:自動展開爲用戶的家目錄,或指定的用戶的家目錄;
{}:可承載一個以逗號分隔的路徑列表,並可以將其展開爲多個路徑(而且能夠嵌套);
例如:/tmp/{a,b} 至關於 /tmp/a /tmp/b
目錄管理類的命令:mkdir, rmdir
mkdir:建立目錄命令(make directories)
mkdir [OPTION]... DIRECTORY...
選項:
-p: 自動按需建立父目錄(建立z目錄,x|y目錄不存在,使用-p選項會自動建立x,y目錄);
[root@centos7 ~]# mkdir -p /sh/x/y/z
-v: verbose,顯示詳細過程;
[root@centos7 ~]# mkdir -pv /sh/x/y/z
mkdir: created directory ‘/sh’
mkdir: created directory ‘/sh/x’
mkdir: created directory ‘/sh/x/y’
mkdir: created directory ‘/sh/x/y/z’
-m MODE:直接給定權限;
[root@centos7 ~]# mkdir -m 777 /sh
drwxrwxrwx 2 root root 6 Feb 23 23:04 /sh/
rmdir:刪除空目錄(remove empty directories)
rmdir [OPTION]... DIRECTORY...
選項:
-p:刪除某目錄後,若是其父目錄爲空,則一併刪除之(此操做很危險);
[root@centos7 ~]# rmdir -p /sh/a/b/c
rmdir: failed to remove directory ‘/’: Device or resource busy
-v: 顯示過程;
tree命令:
tree [options] [directory]
選項:
-L level:執行顯示的層級
[root@centos7 ~]# tree -L 2 /etc/
/etc/
├── adjtime
├── aliases
├── aliases.db
├── alternatives
│ ├── ld -> /usr/bin/ld.bfd
基於之上特性和命令,來兩道題(解答在文章最後):
問題1:如何建立/tmp/x/y1, /tmp/x/y2, /tmp/x/y1/a, /tmp/x/y1/b
問題2:如何建立a_c, a_d, b_c, b_d;
問題3:建立以下目錄結構:
/tmp/mysysroot/
|-- bin
|-- etc
| `-- sysconfig
| `-- network-scripts
|-- sbin
|-- usr
| |-- bin
| |-- lib
| |-- lib64
| |-- local
| | |-- bin
| | |-- etc
| | |-- lib
| | `-- sbin
| `-- sbin
`-- var
|-- cache
|-- log
`-- run
Bash的基礎特性:命令的執行狀態結果
命令執行的狀態結果:
bash經過狀態返回值來輸出此結果:
成功:0
失敗:1-255
命令執行完成以後,狀態返回值保存於bash的特殊變量$?中
[root@centos7 ~]# echo $?
命令正常執行時,有的還回有命令返回值:
根據命令及其功能不一樣,結果各不相同
Bash的基於特性:引用
強引用:''
弱引用:""
命令引用:``
引用命令的執行結果:
$(Command):
[root@centos7 ~]# mkdir $(date +%F)
``:
[root@centos7 ~]# mkdir `date +%F`
drwxr-xr-x 2 root root 6 Feb 25 07:51 2017-02-25
注:兩種執行後的效果同樣,通常腳本規範美觀實用第一種方式
Bash基礎特性:快捷鍵
Ctrl+a:跳至命令行首
Ctrl+e:跳至命令行尾
Ctrl+u:刪除行首至光標所在處以前的全部字符
Ctrl+k:刪除光標所在處至行尾的全部字符(包括光標字符)
Ctrl+l:清屏,至關於clear命令
Bash基礎特性:globbing
globbing:文件名通配(總體文件名匹配,而非部分)
匹配模式:元字符
*:匹配任意長度的任意字符
pa*, *pa*, *pa, *p*a*
pa, paa, passwd(匹配到的)
?:匹配任意單個字符
pa?, ??pa, p?a, p?a?
[]:匹配指定範圍內的任意單個字符
有幾種特殊格式:
[a-z], [A-Z], [0-9], [a-z0-9] (單指定a-z不區分大小寫)
[[:upper:]]:全部大寫字母
[[:lower:]]:全部小寫字母
[[:alpha:]]:全部字母
[[:digit:]]:全部數字
[[:alnum:]]:全部的字母和數字
[[:space:]]:全部空白字符
[[:punct:]]:全部標點符號
[^]:匹配指定範圍外的任意單個字符
例:
[^[:upper:]]
[^0-9]
[^[:alnum:]]
練習1:顯示/var目錄下全部以l開頭,以一個小寫字母結尾,且中間出現一位任意字符的文件或目錄;
練習2:顯示/etc目錄下,以任意一位數字開頭,且以非數字結尾的文件或目錄;
練習3:顯示/etc目錄下,以非字母開頭,後面跟一個字母及其它任意長度任意字符的文件或目錄;
練習4:複製/etc目錄下,全部以m開頭,以非數字結尾的文件或目錄至/tmp/magedu.com目錄
練習5:複製/usr/share/man目錄下,全部以man開頭,後跟一個數字結尾的文件或目錄至/tmp/man/ 目錄下;
練習6:複製/etc目錄下,全部以.conf結尾,且以m,n,r,p開頭的文件或目錄至/tmp/conf.d/目錄下;
解答:
1.[root@test7_1 sh]# ls -d /var/l?[[:lower:]]
2.[root@test7_1 sh]# ls -d /etc/[0-9]*[^0-9]
3.[root@test7_1 sh]# ls -d /etc/[^a-z][a-z]*
4.[root@test7_1 sh]# cp -r /etc/m*[^0-9] /tmp/magedu.com/
5.[root@test7_1 sh]# cp -r /usr/share/man/man[0-9] /tmp/man/
6.[root@test7_1 sh]# cp -r /etc/[mnrp]*.conf /tmp/conf.d/
Bash特性之:命令hash
當執行命令時,首先會去hash緩存中查找,查找到會提取使用;未查找到纔會查找命令文件,並執行 hash命令只會記錄外部命令,內部命令是不會被記錄。
緩存此前命令的查找結果:key-value格式
key:搜索鍵
value:值
hash命令:
hash:列出
hash -d COMMAND(ls):刪除
hash -r:清空
Bash的特性之:變量
程序:指令+數據
指令:由程序文件提供;
數據:IO設備、文件、管道、變量
程序也至關於:算法+數據結構
算法:設計解決問題的路徑
變量名+指向的內存空間=變量
變量賦值:name=value
變量類型:存儲格式、表示數據範圍、參與的運算
編程語言:
強類型變量:如C、C++...
弱類型變量:bash屬於此類
bash把全部變量通通視做字符型;
bash中的變量無需事先聲明;至關於,把聲明和賦值過程同時實現;
聲明:類型,變量名
變量替換:把變量名出現的位置替換爲其所指向的內存空間中數據;
變量引用方式:${var_name}, $var_name
變量名:變量名只能包含數字、字母和下劃線,並且不能以數字開頭;
變量名:見名知義,命名機制遵循某種法則;不可以使用程序的保留字,例如if, else, then, while等等;
bash變量類型:
本地變量:做用域僅爲當前shell進程;
環境變量:做用域爲當前shell進程及其子進程;
局部變量:做用域僅爲某代碼片段(函數上下文);
位置參數變量:當執行腳本的shell進程傳遞的參數;
特殊變量:shell內置的有特殊功用的變量;
$?:
0:成功
1-255:失敗
本地變量:
變量賦值:name=value
變量引用:${name}, $name
"":變量名會替換爲其值;
'':變量名不會替換爲其值;
查看變量:set
撤銷變量:unset name
注意:此處不須要變量引用;
環境變量:
變量賦值聲明:
(1) export name=value
(2) name=value
export name
(3) declare -x name=value
(4) name=value
declare -x name
注:以上變量聲明只對當前shell及其子進程生效
變量引用:${name}, $name
注意:bash內嵌了許多環境變量(一般爲全大寫字符),用於定義bash的工做環境
PATH, HISTFILE, HISTSIZE, HISTFILESIZE, HISTCONTROL, SHELL, HOME, UID, PWD, OLDPWD
查看環境變量:export, declare -x, printenv, env
撤銷環境變量:unset name
只讀變量:
(1) declare -r name
(2) readonly name
只讀變量沒法從新賦值,而且不支持撤銷;存活時間爲當前shell進程的生命週期,隨shell進 程終止而終止;
Bash特性之多命令執行:
分號(;)
[root@test7_1 ~]# COMMAND1; COMMAND2; COMMAND3; ...
執行順序從左到右執行,沒有邏輯關係
邏輯運算:
運算數:真(true, yes, on, 1)
假(false, no, off, 0)
與(乘法):
1 && 1 = 1
1 && 0 = 0
0 && 1 = 0
0 && 0 = 0
或(加法):
1 || 1 = 1
1 || 0 = 1
0 || 1 = 1
0 || 0 = 0
非(取反):
! 1 = 0
! 0 = 1
異或:
不相同則爲1,相同則爲0
短路法則:
[root@test7_1 ~]# COMMAND1 && COMMAND2
COMMAND1爲「假」,則COMMAND2不會再執行;
不然,COMMAND1爲「真」,則COMMAND2必須執行;
[root@test7_1 ~]# COMMAND1 || COMMAND2
COMMAND1爲「真」,則COMMAND2不會再執行;
不然,COMMAND1爲「假」,則COMMAND2必須執行;
示例:
[root@test7_1 ~]# ll /sh/mydata.txt || touch /sh/mydata.txt
ls: cannot access /sh/mydata.txt: No such file or directory
-rw-r--r-- 1 root root 0 Apr 16 21:03 mydata.txt