NUL 分隔變數

NUL 分隔變數

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並儲存結果來解決拋出警告訊息的直接問題。但這仍然會讓你的邏輯有缺陷,因為有換行符的檔案名稱仍然會被破壞。

使用數組,使用mapfileor指令(在 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
%

相關內容