嵌套美元 $ 符号表示替代

嵌套美元 $ 符号表示替代

我想避免创建临时变量并ls通过索引获取元素。

这是我到目前为止尝试过的

echo ${"$(ls)"[2]}

但我收到了严重的替换错误。

答案1

希望这可以帮助

echo "${ls[2]}"

答案2

我自己找到了答案。你可以用类似这样的命令来解析ls输出sed

echo $(ls | sed '2q;d')

在我的情况下,它将产生2第 nd 行。请注意,它还支持名称中带有空格的文件。

答案3

您应该使用 shell glob 来做这类事情,而不是使用 的输出ls

*将展开为当前目录中非隐藏文件的列表,其字典顺序与ls您所在语言环境中的输出相同。在 bash 中,您可以将其捕获到命名数组中:

files=( * )

"${files[1]}"然后以(bash 中数组从零开始索引)的形式访问第二项;或者使用 shell 的位置参数

set -- *

然后只需按 即可访问第二个文件"$2"。(位置参数数组$@也是从零开始索引的,但第 0 个元素保留给当前程序名称。)

如果你切换zsh可以做一些更像你想要的“一行”的事情,使用glob 限定符

echo *([2])

(默认情况下,zsh 中的数组是从 1 开始索引的)或者更好

print -r -C1 *(N[2])

man zshexpn参阅详情。

相关内容