bash 特性

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ò)展的兩種方式

  1. 轉(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
    
  2. 加引號來防止擴(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ù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鞠抑,一起剝皮案震驚了整個濱河市饭聚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌搁拙,老刑警劉巖秒梳,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異箕速,居然都是意外死亡酪碘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門盐茎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兴垦,“玉大人,你說我怎么就攤上這事字柠√皆剑” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵窑业,是天一觀的道長钦幔。 經(jīng)常有香客問我,道長常柄,這世上最難降的妖魔是什么节槐? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任搀庶,我火速辦了婚禮,結(jié)果婚禮上铜异,老公的妹妹穿的比我還像新娘哥倔。我一直安慰自己,他們只是感情好揍庄,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布咆蒿。 她就那樣靜靜地躺著,像睡著了一般蚂子。 火紅的嫁衣襯著肌膚如雪沃测。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天食茎,我揣著相機(jī)與錄音蒂破,去河邊找鬼。 笑死别渔,一個胖子當(dāng)著我的面吹牛附迷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播哎媚,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼喇伯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拨与?” 一聲冷哼從身側(cè)響起稻据,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎买喧,沒想到半個月后捻悯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡淤毛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年今缚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钱床。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡荚斯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出查牌,到底是詐尸還是另有隱情事期,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布纸颜,位于F島的核電站兽泣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏胁孙。R本人自食惡果不足惜唠倦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一称鳞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧稠鼻,春花似錦冈止、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至慌盯,卻和暖如春周霉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背亚皂。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工俱箱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人灭必。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓狞谱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親厂财。 傳聞我的和親對象是個殘疾皇子芋簿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351