使用 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
我正在尝试遍历一条鱼 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