如何从Fish Shell函数返回一个数组

Oli*_*alo 14 fish

我试图从函数返回一个数组.下面的代码不起作用.

function testArray
   echo 1 2 3 4
end

set r (testArray)

echo $r[2]
# error
Run Code Online (Sandbox Code Playgroud)

使用fish shell从函数返回多个值的正确方法是什么?

rid*_*ish 13

命令替换的结果通过拆分换行符成为一个列表(技术上是内容$IFS,但不鼓励修改IFS).

所以你可以用换行替换空格,也许用tr:

function testArray
   echo 1 2 3 4
end
set r (testArray | tr ' ' \n)
echo $r[2]
Run Code Online (Sandbox Code Playgroud)

或者修改函数直接输出换行符:

function testArray
   echo \n1\n2\n3\n4
end
set r (testArray)
echo $r[2]
Run Code Online (Sandbox Code Playgroud)

https://github.com/fish-shell/fish-shell/issues/445跟踪生成列表的更好机制.


Édo*_*pez 5

ridiculous_fish所述,您可以使用本机换行机制。

通过替换换行符($IFS),命令替换的结果成为列表

所以

  1. 每行列出一项;
  2. 然后用命令替换捕获它。

清单

function __list_public_keys
    for key in ~/.ssh/*.pub
        echo $key
    end
end
Run Code Online (Sandbox Code Playgroud) 输出
$ __list_public_keys
/home/ed8/.ssh/id_rsa.blabla.pub
/home/ed8/.ssh/id_rsa.pub
/home/ed8/.ssh/id_rsa.test.pub
Run Code Online (Sandbox Code Playgroud)

捕捉

function __add_keys
    set keys (__list_public_keys)

    echo "[" $keys "]"
end
Run Code Online (Sandbox Code Playgroud) 输出
$ __add_keys
[/home/ed8/.ssh/id_rsa.blabla.pub] [/home/ed8/.ssh/id_rsa.pub] [/home/ed8/.ssh/id_rsa.test.pub]
Run Code Online (Sandbox Code Playgroud)