使用 Fish Shell 脚本更改循环中列表的值

Jes*_*sse 1 shell scripting fish

我正在尝试迭代鱼壳列表并更改元素的值,将这些新值保存到该列表中。

原始列表的填充方式如下:

set -l dockApplications (ls $HOME/.config/plank/dock1/launchers/)
Run Code Online (Sandbox Code Playgroud)

这可以工作并生成一个如下所示的列表:

emacsclient.dockitem firefox.dockitem monodevelop.dockitem Thunar.dockitem
Run Code Online (Sandbox Code Playgroud)

现在我想迭代它并将字符串“dockitem”更改为“desktop”。

我尝试过 for 循环,但似乎没有正确使用它:

for application in $dockApplications
     echo $application
     set application (string replace 'dockitem' 'desktop' $application )
     echo $application
     echo "==========="
end
Run Code Online (Sandbox Code Playgroud)

这回显了字符串操作之前和之后的情况,我生成了正确的字符串。但是当我echo $dockApplications在 for 循环之后做类似的事情时。我得到带有“docitem”扩展名的字符串列表。

我也尝试过$dockApplications以不同的方式设置变量,例如:

set -l dockApplications (string replace 'dockitem' 'desktop' (ls $HOME/.config/plank/$dockdir/launchers/))
Run Code Online (Sandbox Code Playgroud)

但这似乎返回了带有“docitem”扩展名的相同字符串列表。

我认为我从根本上误解了变量的分配方式或变量的范围是如何处理的。

我从来没有完全专注于 shell 脚本编写。我可以阅读它并了解正在发生的事情,但在实现它时,当我尝试以不同语言的方式实现某些目标时,我遇到了一些障碍。但我意识到 shell 脚本的强大之处,并且希望能做得更好。因此,非常感谢任何有关如何以鱼壳惯用方式执行此操作的指示。

gle*_*man 5

我将迭代列表的索引,以便您可以就地更新:

set apps (printf "%s\n" ./launchers/*.dockitem)
for i in (seq (count $apps))
    set apps[$i] (string replace "dockitem" "desktop" $apps[$i])
end
printf "%s\n" $apps
Run Code Online (Sandbox Code Playgroud)

这也可以在没有循环的情况下工作:

set apps (string replace dockitem desktop (printf "%s\n" ./launchers/*.dockitem))
printf "%s\n" $apps
Run Code Online (Sandbox Code Playgroud)

如果我记得的话,fish 在保存到数组时会在换行符上分割命令替换的输出