我想避免创建临时变量并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
参阅详情。