
GNU bash,版本 4.4.19(1)-release (x86_64-pc-linux-gnu)
想法是將變數設定為 NUL 分隔的資料集。這裡$samples
然而,這會導致:
警告:命令替換:忽略輸入中的空字節
當做:
samples="$(find . -type d -iregex './sample[0-9][0-9]' -printf "%f\0" | sort -z)"
我想我可以重複使用這個變量,因為我需要多次迭代相同的值:
while IFS= read -rd '' sample; do
echo $sample
done<<< "$samples"
我可以\n
在\0
尋找在這種情況下命令,但想知道如果可能的話,一般來說如何使用 NUL 分隔符號來執行此操作。
我可以選擇這樣做:
while IFS= read -rd '' sample; do
echo $sample
done< <(find . -type d -iregex './E[0-9][0-9]' -printf "%f\0" | sort -z)
但是 - 因為我需要循環它幾次,所以它會產生一些非常冗餘的程式碼 - 並且必須運行尋找和種類每次都發出命令。
也許將結果轉換為數組?
- 這可能嗎?
- 為什麼不能原樣使用 NUL 分隔資料?
答案1
事實上,\0
由於底層 C 實現的原因,您無法在 bash 字串上下文中儲存空位元組。看為什麼 $'\0' 或 $'\x0' 是空字串?應該是空字符,不是嗎?。
一種選擇是在排序命令之後去除空字節,在管道末尾使用tr
並儲存結果來解決拋出警告訊息的直接問題。但這仍然會讓你的邏輯有缺陷,因為有換行符的檔案名稱仍然會被破壞。
使用數組,使用mapfile
or指令(在 bash 4.4+ 上)直接取得指令readarray
結果find
IFS= readarray -t -d '' samples < <(find . -type d -iregex './sample[0-9][0-9]' -printf "%f\0" | sort -z)
答案2
shellbash
不支援你想做的事情。外殼zsh
開箱即用。
% mkdir sample11 SAMple12 sample21 sample22 dir1
% ll
total 20
drwxrwxr-x 2 fpm fpm 4096 Jun 9 13:46 dir1
drwxrwxr-x 2 fpm fpm 4096 Jun 9 13:46 sample11
drwxrwxr-x 2 fpm fpm 4096 Jun 9 13:46 SAMple12
drwxrwxr-x 2 fpm fpm 4096 Jun 9 13:46 sample21
drwxrwxr-x 2 fpm fpm 4096 Jun 9 13:46 sample22
% samples=$(find . -type d -iregex './sample[0-9][0-9]' -print0 | sort -z)
% echo $samples
./sample11./SAMple12./sample21./sample22
% echo $samples | od -a
0000000 . / s a m p l e 1 1 nul . / S A M
0000020 p l e 1 2 nul . / s a m p l e 2 1
0000040 nul . / s a m p l e 2 2 nul nl
0000055
%