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

Changing Values of Lists In Loop With Fish Shell Script

我正在尝试遍历一条鱼 shell 列表并更改元素的值,将这些新值保存到该列表中。

原始列表是这样填充的:

set -l dockApplications (ls $HOME/.config/plank/dock1/launchers/)

这有效并生成如下列表:

emacsclient.dockitem firefox.dockitem monodevelop.dockitem Thunar.dockitem

现在我想遍历它并将字符串 "dockitem" 更改为 "desktop"。

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

for application in $dockApplications
     echo $application
     set application (string replace 'dockitem' 'desktop' $application )
     echo $application
     echo "==========="
end

这与字符串操作前后相呼应,我生成了正确的字符串。但是当我在 for 循环之后做类似 echo $dockApplications 的事情时。我得到了扩展名为 "dockitem" 的字符串列表。

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

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

但这似乎 return 具有 "dockitem" 扩展名的相同字符串列表。

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

我从来没有全神贯注于 shell 脚本。我可以阅读它并了解正在发生的事情,但是在实施它时,当我尝试以一种我会使用不同语言的方式实现某些目标时,我遇到了一些障碍。但我意识到 shell 脚本的强大功能,并希望在这方面做得更好。因此,非常感谢任何关于如何以 fish shell 惯用方式执行此操作的指示。

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

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

这也适用于没有循环的情况:

set apps (string replace dockitem desktop (printf "%s\n" ./launchers/*.dockitem))
printf "%s\n" $apps

如果我记得,fish 在保存到数组时将命令替换的输出拆分为换行符

这可能不是最优雅的解决方案,但这是使用古老的 string 函数执行此操作的一种纯粹的鱼方法。

set mystring "Lorem ipsum dolor sit amet, consectetur adipisicing elit"
set mywords (string split " " $mystring)
for i in (seq (count $mywords))
    set mywords[$i] (string upper (string sub -s 1 -l 1 $mywords[$i]))(string sub -s 2 $mywords[$i])
end
echo $mywords