Bash
無法訪問從 readarray 建構的數組的元素
我正在嘗試在 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請參閱何時需要雙引號?