【问题标题】:Changing Values of Lists In Loop With Fish Shell Script使用 Fish Shell 脚本在循环中更改列表的值
【发布时间】: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 语言的原因是手册始终在手边。
  • application var 没有获取到原始值的引用,它获取了值的副本。因此,您正在修改原始值的副本。除了 Glenn 提供的解决方案,我建议不要修改原始数组。在迭代原始数组时创建一个新数组。

标签: shell scripting fish


【解决方案1】:

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

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 在保存到数组时会在换行符上拆分命令替换的输出

【讨论】:

  • 感谢这项工作!我也意识到我的一个解决方案也有效,但我拼错了“dock”。
  • 不需要printf,如果文件名包含换行符,它甚至会添加一个(主要是理论上的)错误。直接set apps ./launchers/*.dockitem即可。
  • 如果您真的不关心换行符,您也可以直接调用set apps (string replace "dockitem" "desktop" -- ./launchers/*.dockitem) 并完全跳过循环。
【解决方案2】:

这可能不是最优雅的解决方案,但这是一种使用古老的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多