5 bash shell特性
5.1 命令行擴(kuò)展
功能:把命令行中輸入的特殊字符 自動替換為 相應(yīng)的字符串
5.1.1 家目錄
- ~ 表示當(dāng)前用戶家目錄
- ~username 表示指定用戶家目錄
5.1.2 執(zhí)行結(jié)果引用:$( )
功能:把一個命令的輸出結(jié)果 作為另一個命令的參數(shù)
$(CMD) 或 `CMD`(反單引號)
使用舉例:
[root@CentOS8 data]#echo "this system's name is $(hostname)"
this system's name is CentOS8.jacklee
[root@CentOS8 data]#echo "caokunzi is `whoami`"
caokunzi is root
[root@CentOS8 data]#touch $(date +%F).log
[root@CentOS8 data]#ll
total 0
-rw-r--r--. 1 root root 0 Jul 3 10:33 2020-07-03.log
5.1.3 括號擴(kuò)展:{ }
實現(xiàn)打印重復(fù)字符串的簡化形式(按照ASCII碼,順序或倒序排列均可)
簡單應(yīng)用:
[root@CentOS8 data]#echo zhubazi{1,5,9}
zhubazi1 zhubazi5 zhubazi9
[root@CentOS8~]#echo a{d,g,j}c
adc agc ajc
[root@CentOS8 data]#echo {1..5}
1 2 3 4 5
[root@CentOS8 data]#echo {a..d}
a b c d
[root@CentOS8 data]#echo {b..X}
b a ` _ ^ ] [ Z Y X
[root@CentOS8 data]#echo {A..z}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@CentOS8 data]#echo {00..10}
00 01 02 03 04 05 06 07 08 09 10
[root@CentOS8 data]#echo {1..10..2}
1 3 5 7 9
[root@CentOS8 data]#echo {20..1..3}
20 17 14 11 8 5 2
[root@CentOS8~]#echo {a..h..2} #字母也可以等差排列E绯取7∮狻菠秒!
a c e g
高級應(yīng)用:
[09:59:47root@CentOS8~]#mkdir -p /data/{a,b,c}/
[10:00:39root@CentOS8~]#tree /data/
/data/
├── a
├── b
└── c
[10:03:04root@CentOS8~]#mkdir -p /data/{a,b}/{x,y}
[10:03:11root@CentOS8~]#tree /data/
/data/
├── a
│ ├── x
│ └── y
└── b
├── x
└── y
{ }的擴(kuò)展功能可關(guān)閉
echo $-
[10:07:36jack@ubuntu1804~]$ echo $-
himBHs #每個字母表示一種功能
#其中B控制擴(kuò)展
set +B 取消擴(kuò)展功能
[21:32:14root@CentOS8/~]# echo {1..5}
1 2 3 4 5
[21:32:16root@CentOS8/~]# set +B
[21:32:26root@CentOS8/~]# echo {1..5}
{1..5}
[21:32:28root@CentOS8/~]# set -B
[21:32:40root@CentOS8/~]# echo {1..5}
1 2 3 4 5
5.1.4 防止擴(kuò)展的兩種方式
-
轉(zhuǎn)義:加反斜線(\) 使之成為普通字符
[root@CentOS8 ~]# echo cost:$5.00 #系統(tǒng)默認(rèn)$5是一個變量践叠,輸出無法達(dá)到預(yù)計效果 cost:.00 [root@CentOS8 ~]# echo cost:\$5.00 #加\之后轉(zhuǎn)義為普通字符禁灼,即可正常顯示 cost:$5.00
-
加引號來防止擴(kuò)展
正向單引號 ‘ ’ 雙引號 “ ” 反向單引號 `` 一律按普通字符處理 只支持變量 支持命令、支持變量 #引號的功能區(qū)分 [root@CentOS8 ~]# echo 'echo $USER' #單引六親不認(rèn) echo $USER [root@CentOS8 ~]# echo "echo $USER" #雙引只認(rèn)變量 echo root [root@CentOS8 ~]# echo `echo $USER` #反向全部生效 root
5.2 通配符 glob
功能:對相關(guān)文件名進(jìn)行匹配僻孝,實現(xiàn)快速引用多個文件
* 匹配零個或多個字符
? 匹配任意#單個字符
~ 當(dāng)前用戶家目錄
~jack 用戶jack的家目錄
~- 上一個工作目錄
中括號[ ]匹配指定集合內(nèi)任意單個字符 #單個4┟7址伞F┟ā!1鸷椤A巍!痢毒!
[[:digit:]] 匹配單個數(shù)字
[[:lower:]] 匹配單個小寫字母
[[:upper:]] 匹配單個大寫字母
[[:alpha:]] 任意單個字母
[[:alnum:]] 任意單個數(shù)字或字母
[[:blank:]] #空格和Tab
[[:space:]] #任意單個空白字符(包括但不限于空格和Tab)
[[:punct:]] 任意單個標(biāo)點(diǎn)
[[:print:]] 可打印的'所有字符
[[:graph:]] 可打印的'圖形字符
[[:cntrl:]] 非打印字符
[jack] 匹配列表中的任何的一個字符哪替,j/a/c/k任何一個
[^jack] 匹配 除了j/a/c/k之外的 任何一個 # ^表示取反9交场0怠!
5.3 變量
變量的功能:
- 在程序中多次引用身冀,修改變量即可達(dá)到全局修改效果括享,提升效率
- 將一個非常長的字符串賦值給一個短小變量名,方便使用
5.3.1 變量賦值和引用
在bash中使用變量兄墅,需要先進(jìn)行定義(賦值)
#變量名=變量對應(yīng)的值
如 NAME=jacklee #等號的前后不能有空格O断獭3上础!3浒;!1九椤8直]毫铡!
#引用變量使用 $變量名
echo $NAME
#刪除自定義變量
unset NAME
使用變量需要遵守的規(guī)則:
變量名只允許包含英文字母诱贿、數(shù)字咕缎、下劃線凭豪,而且不能以數(shù)字開頭
變量名避免使用shell中的命令和關(guān)鍵字,如 id 孔厉、do
-
變量值包括空格時帖努,應(yīng)該使用引號括起來拼余,如 ‘ ’ ” “
[11:49:31root@CentOS8~]#VAR=zhu bazi bash: bazi: command not found... Failed to search for file: Cannot update read-only repo [14:02:54root@CentOS8~]#VAR='zhu bazi' [14:03:06root@CentOS8~]#echo $VAR zhu bazi
-
轉(zhuǎn)義符(\):可取消特殊字符的功能匙监,視為普通字符處理
[14:03:16root@CentOS8~]#PAY=$100 [14:03:51root@CentOS8~]#echo $PAY 00 [14:04:04root@CentOS8~]#PAY=\$100 [14:04:10root@CentOS8~]#echo $PAY $100
若變量未賦值直接引用,其值為空稼钩,即null达罗,不是空格!8П省击儡!
-
引用變量時阳谍,若變量名和其他字符相連螃概,需要使用格式 ${變量名}
[14:04:12root@CentOS8~]#NAME=jack [14:09:40root@CentOS8~]#echo $NAME$PAY #兩個變量緊挨著吊洼,正常引用 jack$100 [14:10:40root@CentOS8~]#echo $NAME_$PAY #兩變量之間有下劃線,前者信息丟失5莼ΑW垡骸谬莹! $100 [14:12:03root@CentOS8~]#echo ${NAME}_$PAY #兩個變量相連附帽,前者需要加花括號{} jack_$100 [14:12:33root@CentOS8~]#echo ${NAME}_$PAY_$VAR jack_zhu bazi [14:15:48root@CentOS8~]#echo ${NAME}_${PAY}_$VAR #多個變量,只有最后一個不用加 jack_$100_zhu bazi
5.3.2 變量的分類
bash中的變量基本分類:
- 內(nèi)置:bash中自帶的變量
- 自定義:用戶根據(jù)自身需要實現(xiàn)的
按作用范圍分類:
普通變量——作用于當(dāng)前shell進(jìn)程
shell進(jìn)程終止則變量自動撤銷-
環(huán)境變量——作用于當(dāng)前shell進(jìn)程以及其子進(jìn)程
使用bash命令可開啟新的子shell整胃,pstree可查看詳情
在子shell中用unset刪除自定義環(huán)境變量爪模,父shell中不會失效
需要使用export或declare -x來聲明 才可成為環(huán)境變量 #聲明環(huán)境變量 export name=VALUE declare -x name=VALUE #顯示所有環(huán)境變量相關(guān)的命令 env export declare -x
-
本地變量——作用于可引用到的范圍荚藻,比如函數(shù)
需要使用local來聲明 #聲明本地變量 local 變量名 #顯示所有變量和函數(shù)Sτ!3凇N竟尽!;诖贰5ノ摺洲鸠! set
按是否可修改分類
可修改變量
-
只讀變量(需要用戶自己聲明)
#聲明只讀變量格式: readonly 變量名 #顯示所有只讀變量相關(guān)命令 readonly declare -r
只讀變量聲明后不可用unset刪除
[14:40:43root@CentOS8~]#readonly PI [14:40:49root@CentOS8~]#PI=3.14159 -bash: PI: readonly variable [14:41:00root@CentOS8~]#unset PI -bash: unset: PI: cannot unset: readonly variable
5.3.3 常見的系統(tǒng)內(nèi)置變量
存在一些特殊的變量扒腕,實現(xiàn)shell的特定功能
UID: 當(dāng)前用戶的UID
HOME: 當(dāng)前用戶的家目錄
SHELL: 當(dāng)前使用的shell類型 /bin/bash
BASHPID: 當(dāng)前bash的進(jìn)程編號
HISTSIZE: 緩沖區(qū)記錄命令歷史的數(shù)量
MAIL: 當(dāng)前用戶的郵件信息儲存目錄 /var/spool/mail/root
PATH: 二進(jìn)制執(zhí)行文件(外部命令)的搜索路徑
LANG: 系統(tǒng)使用的語言和編碼字符集 en_US.UTF-8
RANDOM: 生成隨機(jī)數(shù),0~32767
PS1: 命令提示符
OSTYPE: 操作系統(tǒng)類型 linux-gnu
HOSTTYPE: 主機(jī)類型 x86_64
MACHTYPE: 機(jī)器類型 x86_64-redhat-linux-gnu
5.3.4 執(zhí)行狀態(tài)結(jié)果變量
每個命令執(zhí)行完畢都會生成一個狀態(tài)碼更啄,稱為執(zhí)行狀態(tài)結(jié)果祭务,不直接在屏幕顯示
echo $? 輸出狀態(tài)碼
=0 表示上個命令執(zhí)行成功
=1~255表示出現(xiàn)錯誤
[15:01:05root@CentOS8data]#ll a
total 0
drwxr-xr-x 2 root root 6 Jul 25 10:03 x
drwxr-xr-x 2 root root 6 Jul 25 10:03 y
[15:01:14root@CentOS8data]#echo $?
0
[15:01:20root@CentOS8data]#ll c
ls: cannot access 'c': No such file or directory
[15:01:25root@CentOS8data]#echo $?
2
5.4 變量中使用引號
正向單引號 ‘ ’ | 雙引號 “ ” | 反向單引號 `` |
---|---|---|
一律按普通字符處理 | 只支持變量 | 支持命令义锥、支持變量 |
大傻 | 二傻 | 與 $( ) 功能相同 |
[root@CentOS8 ~]# echo 'echo $USER'
echo $USER
[root@CentOS8 ~]# echo "echo $USER"
echo root
[root@CentOS8 ~]# echo `echo $USER`
root
[root@CentOS8data]#echo $(echo $USER)
root
因此反單引號與 $( ) 經(jīng)常用于 命令輸出結(jié)果被另一個命令引用的情形
5.5 同時執(zhí)行多個命令
5.5.1 分號連接
用分號按順序連接即可
cmd1;cmd2;cmd3...
[15:52:07root@CentOS8data]#ls;echo $LANG;cat /etc/issue
a b
en_US.UTF-8
\S
Kernel \r on an \m
5.5.2 括號 ( ) 和 { }
(cmd1;cmd2;cmd3...)
{ cmd1;cmd2;cmd3...cmdN; } #前方需要加空格0璞丁!噪径!
需要注意
- 使用()會開啟子shell柱恤,在()內(nèi)部的變量賦值不會影響當(dāng)前shell中的變量值
- 開頭{ 與第一個命令之間至少要有一個空格,最后一個命令必須以 找爱;結(jié)束
試比較以下兩種命令的輸出結(jié)果:
[root@centos8 ~]#name=mage;(echo $name;name=wang;echo $name );echo $name
mage
wang #由于開啟了子shell梗顺,后續(xù)name的值仍然是mage
mage
[root@centos8 ~]#name=mage;{ echo $name;name=wang;echo $name; } ;echo $name
mage
wang
wang #未開啟子shell,因此name賦值已經(jīng)改變
5.6 命令行歷史與其調(diào)用
5.6.1 命令歷史
使用bash shell過程中车摄,執(zhí)行過的命令會被記錄到history的緩沖區(qū)寺谤,當(dāng)用戶注銷時仑鸥,緩沖區(qū)中的命令歷史會被追加保存到/.bash_history文件中,再次登錄shell時眼俊,會讀取命令歷史文件中記錄下的命令/.bash_history
登錄進(jìn)shell后新執(zhí)行的命令會繼續(xù)記錄在緩存中,用戶退出時再追加至上述文件儲存
因此退出重新登錄即可將剛剛執(zhí)行的命令寫入歷史文件中
5.6.2 history命令
history命令可以顯示和管理曾經(jīng)執(zhí)行過的命令
history [-c] 或 [-d offset] [n]
-c: 清空緩沖區(qū)的所有歷史命令#只對緩沖區(qū)
-d offset: 刪除歷史中指定的#第n個命令
history -anrw [filename]
-a: 將歷史命令緩沖區(qū)中的命令寫入歷史命令文件中 #保存緩沖區(qū)內(nèi)容
-n: 讀歷史文件中未讀過的行到歷史列表
-r: 將歷史命令文件中的命令讀取到當(dāng)前歷史命令緩沖區(qū)#填充緩沖區(qū)
-w: 保存命令歷史列表到指定的歷史文件
history -ps arg [arg...]
-p: 展開歷史參數(shù)成多行粟关,但不存在歷史列表中
-s: 展開歷史參數(shù)成一行疮胖,附加在歷史列表后
N: 顯示最近的n條歷史
想要徹底刪除所有歷史,先刪除磁盤.bash_history闷板,再清空緩存澎灸,操作如下:
[root@CentOS8 data]#rm -f .bash_history
[root@CentOS8 data]#history -c
5.6.3 命令歷史相關(guān)環(huán)境變量
HISTSIZE:命令歷史緩沖區(qū)記錄的條數(shù)
HISTFILE:指定歷史文件,默認(rèn)為~/.bash_history
HISTFILESIZE:命令歷史文件記錄的條數(shù)
HISTTIMEFORMAT="%F %T " 在歷史記錄中顯示命令執(zhí)行的時間
HISTIGNORE="str1:str2:…" 忽略以str1與str2開頭*的命令的歷史
HISTCONTROL:控制命令歷史的記錄方式蛔垢,可選項如下:
- ignoredups 是默認(rèn)值击孩,忽略重復(fù)的命令迫悠,認(rèn)為連續(xù)且相同為“重復(fù)”
- ignorespace 忽略所有以空白開頭的命令
- ignoreboth = ignoredups + ignorespace
- erasedups 刪除重復(fù)命令
修改后持久保存:
輸入內(nèi)容:export 變量名="值"
存放在 /etc/profile 或 ~/.bash_profile
同理鹏漆,編輯之后不會立即生效,運(yùn)行 . .bash_profile
5.6.4 調(diào)用命令行歷史
1===重復(fù)前一個命令的幾種方式:
- 使用上方向鍵创泄,并回車執(zhí)行
- 輸入 !! 并回車執(zhí)行
- 輸入 !-1 并回車執(zhí)行
- 按 Ctrl+p 并回車執(zhí)行
- ! n 執(zhí)行歷史中第n個命令
- ! -n 執(zhí)行歷史中倒數(shù)第n個命令
- ! : 0 執(zhí)行上一個不包含參數(shù)的命令
2===命令關(guān)鍵字xxx
重復(fù)#上一個以xxx開頭的命令:艺玲!xxx
重復(fù)#上一個包含xxx的命令:! ? xxx
3===打印輸出但不執(zhí)行 : p
!xxx:p 打印輸出#上一個以xxx開頭的命令
!$:p 打印輸出上一個命令的#最后一個參數(shù)
!*:p 打印輸出上一個命令的#全部參數(shù)
4===調(diào)用上一個命令的 最后一個參數(shù)
- !$
- 快捷鍵 esc , . (先后按)
- 快捷鍵 Alt + . (同時按) #若不起作用,需要設(shè)置Xshell終端>鍵盤
5===在命令歷史中搜索
- Ctrl + r 開始搜索
- Ctrl + g 退出搜索
6===調(diào)用上一個命令的指定參數(shù)
cmd !^ 調(diào)用上個命令第一個arg
cmd !$ 調(diào)用上個命令最后一個arg
cmd !* 調(diào)用上個命令#全部arg
cmd !:n 調(diào)用#第n個arg
- cmd ! n: 再配合上式表示調(diào)用第n條命令的相關(guān)參數(shù)
- cmd ! xxx: 再配合上式表示調(diào)用上個以xxx開頭的命令的相關(guān)參數(shù)