【发布时间】:2021-12-08 15:05:30
【问题描述】:
我需要运行一个使用readarray -d / -t 将文件路径拆分为数组的脚本,但目标系统的readarray 不支持-d 选项(bash 版本4.2.46)
由于我不知道readarray -d / -t 的确切行为,因此我很难为其编写解决方法。
似乎无法将其替换为 IFS=/ read -a,因为包含控制字符的文件名会破坏它,如下所示:
IFS=/ read -a arr < <(echo /home/fravadona/$'\n'/underneath)
declare -p arr
# OUTPUT: declare -a arr='([0]="" [1]="home" [2]="fravadona")'
所以,我的第一个问题是,预期的结果是什么:
readarray -d / -t arr < <(echo /home/fravadona)
readarray -d / -t arr < <(echo /home/fravadona/)
readarray -d / -t arr < <(echo /home/fravadona/$'\n'/underneath)
最后,以下代码是否正确模拟readline -d / -t?
filepath=/home/fravadona/$'\n'/underneath
unset arr; declare -a arr
prefix="${filepath%%/*}"
suffix="${filepath#*/}"
until [ "X$prefix" == "X$suffix" ]
do
arr+=( "$prefix" )
prefix="${suffix%%/*}"
suffix="${suffix#*/}"
done
arr+=( "$prefix" )
【问题讨论】:
-
readarray读取所有输入并生成一个数组。read一次读取一行,为每行生成一个数组。我注意到您有一个不可打印字符的目录。这是恶意软件吗? -
@jordanm:这只是一个破坏可能的 `IFS=/ read -a' 解决方法的示例。
-
what's the expected result of:sooo,你为什么不运行它看看?readarray是 bash 内部的,预期的输出是 bash 想要的,文档基本上是代码文档,而不是规范。 -
@KamilCuk:
readarray -d / arr <<< /home/KamilCuk-bash: readarray: -d: invalid option。如您所见,它在目标系统上不起作用;-) -
哦,所以你的意思是你手头没有 bash5 可用?在线尝试一下。 replit.com 有 bash 另外,使用 docker,docker 总是很方便。