【发布时间】:2016-07-26 14:06:47
【问题描述】:
我正在尝试遍历鱼壳列表并更改将这些新值保存到该列表中的元素的值。
原始列表填充如下:
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/))
但这似乎返回了带有“dockitem”扩展名的相同字符串列表。
我认为我从根本上误解了如何分配变量或如何处理它们的范围。
我从来没有完全理解过 shell 脚本。我可以阅读它并了解正在发生的事情,但是在实现它时,当我尝试以一种不同语言的方式实现某些目标时,我遇到了一些障碍。但我意识到 shell 脚本的强大功能,并希望能做得更好。因此,非常感谢任何有关如何以鱼壳惯用方式执行此操作的指示。
【问题讨论】:
-
帮助我精通 shell 语言的原因是手册始终在手边。
-
applicationvar 没有获取到原始值的引用,它获取了值的副本。因此,您正在修改原始值的副本。除了 Glenn 提供的解决方案,我建议不要修改原始数组。在迭代原始数组时创建一个新数组。