Bash

無法訪問從 readarray 建構的數組的元素

  • July 14, 2021

我正在嘗試在 bash 中建構一個基本的 REPL。該腳本動態填充目錄中的文件列表以供使用者執行。

文件空間:

|
|\ scripts/
|| script1.sh
|| script2.sh
|
\  shell/
| shell.bashrc
| shell.desktop

在 shell.bashrc 中,我使用以下命令獲取文件名數組:

readarray -d " " filenames < <(find ../bin -type f -executable)

filenames我可以很好地列印數組,它包含一個空格分隔的字元串,"script1.sh script2.sh"按預期保存。

但是當我嘗試使用它訪問數組的第一個元素時,echo ${filenames[0]}它會列印每個元素。除了 0 之外的任何其他索引都返回一個空字元串。

我的bash版本是5.0.17,文件的第一行是#!/bin/bash

在嘗試以下導致類似結果後,我開始使用“readarray”:

filenames=($(find "../bin" -type f -executable))

編輯:找到了一個愚蠢的解決方法,仍然想知道原始文章在哪裡搞砸了。解決方法:

readarray -d " " filenames < <(find ../bin -type f -executable)
arr=($filenames)
echo ${arr[1]}

它按預期列印數組的第 6 個元素。

預設情況下,find輸出結果由換行符分隔。通過-d " "在 mapfile/readarray 命令中進行設置,您將導致(假設沒有一個名稱包含空格字元)所有結果都被連接成一個字元串 - 換行符和所有。然後echo ${filenames[0]}(使用未引用的變數擴展${filenames[0]}和預設的 space-tab-newline 值IFS)時,shell 在換行符處拆分,並echo使用空格1重新組合結果。

而是使用

readarray -t filenames < <(find ../bin -type f -executable)

它將輸入解析為換行符分隔的數據,但從儲存的元素中去除尾隨的換行符。或者 - 更好 - 如果您的 bash 版本支持它,

readarray -t -d '' filenames < <(find ../bin -type f -executable -print0)

它使用空字節而不是換行符(使所有合法文件名都安全,即使是那些包含換行符的文件名)。


1請參閱何時需要雙引號?

引用自:https://unix.stackexchange.com/questions/658247