在 Bash 中使用[方括弧] (一)
這篇文章將要介紹方括弧及其在命令行中的不同用法。
-- Paul Brown
這篇文章將要介紹方括弧及其在命令行中的不同用法。
看完 花括弧在命令行中的用法 之後,現在我們繼續來看方括弧([])在上下文中是如何發揮作用的。
通配
方括弧最簡單的用法就是通配。你可能在知道「 (Globbing)」這個概念之前就已經通過通配來匹配內容了,列出具有相同特徵的多個文件就是一個很常見的場景,例如列出所有 JPEG 文件:
ls *.jpg
使用 通配符(wildcard)來得到符合某個模式的所有內容,這個過程就叫通配。
在上面的例子當中,星號(*)就代表「0 個或多個字元」。除此以外,還有代表「有且僅有一個字元」的問號(?)。因此
ls d*k*
可以列出 darkly 和 ducky,而且 dark 和 duck 也是可以被列出的,因為 * 可以匹配 0 個字元。而
ls d*k?
則只能列出 ducky,不會列出 darkly、dark 和 duck。
方括弧也可以用於通配。為了便於演示,可以創建一個用於測試的目錄,並在這個目錄下創建文件:
touch file0{0..9}{0..9}
(如果你還不清楚上面這個命令的原理,可以看一下 另一篇介紹花括弧的文章 )
執行上面這個命令之後,就會創建 file000、file001、……、file099 這 100 個文件。
如果要列出這些文件當中第二位數字是 7 或 8 的文件,可以執行:
ls file0[78]?
如果要列出 file022、file027、file028、file052、file057、file058、file092、file097、file098,可以執行:
ls file0[259][278]
當然,不僅僅是 ls,很多其它的命令行工具都可以使用方括弧來進行通配操作。但在刪除文件、移動文件、複製文件的過程中使用通配,你需要有一點橫向思維。
例如將 file010 到 file029 這 30 個文件複製成 archive010 到 archive029 這 30 個副本,不可以這樣執行:
cp file0[12]? archive0[12]?
因為通配只能針對已有的文件,而 archive 開頭的文件並不存在,不能進行通配。
而這條命令
cp file0[12]? archive0[1..2][0..9]
也同樣不行,因為 cp 並不允許將多個文件複製到多個文件。在複製多個文件的情況下,只能將多個文件複製到一個指定的目錄下:
mkdir archive
cp file0[12]? archive
這條命令是可以正常運行的,但它只會把這 30 個文件以同樣的名稱複製到 archive/ 目錄下,而這並不是我們想要的效果。
如果你閱讀過我 關於花括弧的文章 ,你大概會記得可以使用 % 來截掉字元串的末尾部分,而使用 # 則可以截掉字元串的開頭部分。
例如:
myvar="Hello World"
echo Goodbye Cruel ${myvar#Hello}
就會輸出 Goodbye Cruel World,因為 #Hello 將 myvar 變數中開頭的 Hello 去掉了。
在通配的過程中,也可以使用這一個技巧。
for i in file0[12]?;
do
cp $i archive${i#file};
done
上面的第一行命令告訴 Bash 需要對所有 file01 開頭或者 file02 開頭,且後面只跟一個任意字元的文件進行操作,第二行的 do 和第四行的 done 代表需要對這些文件都執行這一塊中的命令。
第三行就是實際的複製操作了,這裡使用了兩次 $i 變數:第一次在 cp 命令中直接作為源文件的文件名使用,第二次則是截掉文件名開頭的 file 部分,然後在開頭補上一個 archive,也就是這樣:
"archive" + "file019" - "file" = "archive019"
最終整個 cp 命令展開為:
cp file019 archive019
最後,順帶說明一下反斜杠 的作用是將一條長命令拆分成多行,這樣可以方便閱讀。
在下一節,我們會了解方括弧的更多用法,敬請關注。
via: https://www.linux.com/blog/2019/3/using-square-brackets-bash-part-1
作者: Paul Brown 選題: lujun9972 譯者: HankChow 校對: wxy
本文由 LCTT 原創編譯, Linux中國 榮譽推出
點擊「了解更多」可訪問文內鏈接
※小白觀察:Firefox 推出密碼泄露檢測服務
※【每日安全資訊】計算機科學家發布不會被黑的加密代碼
TAG:Linux技術 |