使用鱼壳脚本更改循环列表的值

时间:2016-07-26 14:06:48

标签: shell scripting fish

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

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

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

这样可以生成如下列表:

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

现在我想迭代它并更改字符串" dockitem" to" 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/))

但是这似乎返回了与#34; dockitem"相同的字符串列表。延期。

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

我从未完全围绕shell脚本编写。我可以阅读并了解正在发生的事情,但是当涉及到实现它时,当我尝试以一种我将用不同语言实现的方式时,我遇到了几个障碍。但我意识到shell脚本的强大功能,并希望在它上面做得更好。因此,非常感谢任何有关如何以鱼壳惯用方式执行此操作的指示。

2 个答案:

答案 0 :(得分:4)

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

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会在换行符上拆分命令替换的输出

答案 1 :(得分:0)

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