1. 程式人生 > 實用技巧 >Linux學習-管理檔案(4)

Linux學習-管理檔案(4)

使用命令列擴充套件

Bash shell有多種擴充套件命令列的方式,包括模式匹配、主目錄擴充套件、字串擴充套件和變數替換。

元字元和匹配項表

模式 匹配項
* 由零個或更多字元組成的任意字串
任何一個字元
[abc...] 括起的類(位於兩個方括號之間)中的任何一個字元
[!abc...] 不在括起的類中的任何一個字元
[^abc...] 不在括起的類中的任何一個字元
[[:alpha:]] 任何字母字元
[[:lower:]] 任何小寫字元
[[:upper:]] 任何大寫字元
[[:alnum:]] 任何字母字元或數字

[[:punct:]] 除空格和字母數字以外的任何可列印字元
[[:digit:]] 從0到9的任何單個數字
[[:space:]] 任何一個空白字元。

示例:

簡單模式匹配:

通過星號和問號字元以及一類字元來匹配其中一些檔名

[jumpserver@192 bin]$ ls a*
abrt-action-analyze-backtrace             abrt-dump-xorg                   ar
abrt-action-analyze-c                     abrt-handle-upload               arch
abrt
-action-analyze-ccpp-local abrt-merge-pstoreoops arecord [jumpserver@192 bin]$ ls *a* abrt-action-analyze-backtrace nl-cls-add abrt-action-analyze-c nl-link-enslave abrt-action-analyze-ccpp-local nl-link-ifindex2name abrt-action-analyze-core nl
-link-name2ifindex jumpserver@192 bin]$ ls [ac]* abrt-action-analyze-backtrace analog catman clear abrt-action-analyze-c aplay cc clevis abrt-action-analyze-ccpp-local aplaymidi cd clevis-decrypt abrt-action-analyze-core appstream-compose cd-convert clevis-decrypt-sss [jumpserver@192 bin]$ ls ??? atq c99 col dig env ftp gjs jjs lua mdu ptx red scp sum tee top who zip [jumpserver@192 bin]$ ls ????? alias chacl crash fgrep guild lscpu mmcli nproc pchrt pslog sg_dd tload vlock xmlwf amidi chage dconf flock guile lsiio mmove nroff pgrep quota shred totem watch xzcat

波形符擴充套件:

波形符(~)可匹配當前使用者的主目錄

[jumpserver@192 /]$ ls ~jumpserver
Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos

大括號擴充套件:

1)大括號擴充套件用於生成任意字串

2)大括號包含字串的逗號分隔列表或順序表示式

3)雙句點語法(..)可擴充套件成一個序列,使得{m..p}擴充套件成m n o p

[jumpserver@192 test]$ echo {Sunday,Monday,Tuesday,Wednesday}.log
Sunday.log Monday.log Tuesday.log Wednesday.log
[jumpserver@192 test]$ echo file{1..3}.txt
file1.txt file2.txt file3.txt
[jumpserver@192 test]$ echo file{a..e}.txt
filea.txt fileb.txt filec.txt filed.txt filee.txt
[jumpserver@192 test]$ echo file{a,b}{1,2}.txt
filea1.txt filea2.txt fileb1.txt fileb2.txt
[jumpserver@192 test]$ echo file{a{1,2},b,c}.txt
filea1.txt filea2.txt fileb.txt filec.txt
[jumpserver@192 test]$ mkdir rhel{6,7,8}
[jumpserver@192 test]$ ls R*
ls: cannot access 'R*': No such file or directory
[jumpserver@192 test]$ ls r*
rhel6:
rhel7:
rhel8:

變數擴充套件:

變數的作用類似於可以在記憶體中儲存值的命名容器

通過變數,可以從命令列或在shell指令碼內輕鬆訪問和修改儲存的資料

[jumpserver@192 test]$ USERNAME=operator
[jumpserver@192 test]$ echo $USERNAME
operator
為了避免因其他shell擴充套件而引起的錯誤,可將變數的名稱放在大括號中
[jumpserver@192 test]$ echo ${USERNAME}
operator

命令替換:

1)命令替換允許命令的輸出替換命令列上的命令本身

2)當命令括在括號中並且前面有美元符號($)時,會發生命令替換

[jumpserver@192 test]$ echo Today is $(date)
Today is Sun Nov 15 23:24:08 PST 2020

防止引數被擴充套件:

反斜槓(\)是Bash shell中的轉義字元。它可以防止緊隨其後的字元被擴充套件

[jumpserver@192 /]$ echo the value is $HOME is your home directory
the value is /home/jumpserver is your home directory
[jumpserver@192 /]$ echo the value is \$HOME is your home directory
the value is $HOME is your home directory

如果需要保護較長的字串,則使用單引號('')或雙引號("")來括起字串

單引號:阻止通配和shell擴充套件

雙引號:阻止大部分shell擴充套件

使用雙引號可以阻止通配和shell擴充套件,但依然允許命令和變數替換
[jumpserver@192 /]$ 
echo "---------hostname is ${myhost}------------"
---------hostname is 192------------
[jumpserver@192 /]$ echo "will varialbe $myhost evaluate to $(hostname -s)"
will varialbe 192 evaluate to 192
[jumpserver@192 /]$ echo 'will varialbe $myhost evaluate to $(hostname -s)'
will varialbe $myhost evaluate to $(hostname -s)