gpt4 book ai didi

fish - 有条件地在 fish 中设置局部变量

转载 作者:行者123 更新时间:2023-12-04 12:06:26 25 4
gpt4 key购买 nike

我已经仔细阅读了fish shell 文档,我正在尝试弄清楚如何在fish 函数中有条件地设置局部变量。

换句话说,如果您有一个函数,并且希望使用 if-then-else 逻辑修改局部变量。

function foo
set --local variable something
if blah
set --local variable something_else
end
end

例如,假设我有一个接受文件名作为参数的普通函数,如果缺少文件扩展名,我想将它添加到参数中。
function frob
set --local filename $argv[1]
echo "Before: $filename"

if not string match --regex --entire "\.fish" $filename
set --local filename $filename.fish
end

echo "After: $filename"
end

问题是,由于局部变量只有块作用域,这不起作用。运行该“frob”函数只会在“之前”和“之后”中打印相同的内容。

我能想到的唯一解决方法是使用临时全局变量,并在函数末尾手动删除它。

例子:
function frob
# Use global variable, and try to handle collisions
if set --query --global filename
set --global filename_saved $filename
end

set --global filename $argv[1]
echo "Before: $filename"

if not string match --regex --entire "\.fish" $filename
set --global filename $filename.fish
end

echo "After: $filename"

# Restore old saved value
if set --query --global filename_saved
set --global filename $filename_saved
set --erase --global filename_saved
else
set --global --erase filename
end
end

但是,这种方法存在一些问题。首先,我想检查与预先存在的全局变量可能发生的冲突,并保存任何现有值以在我的脚本退出时恢复。

不幸的是,如果我的脚本由于错误而意外结束,则“清理”代码可能永远不会执行。

我是否错过了一些更好的方法来解决这个问题?

最佳答案

“本地”有点用词不当。它是“块范围的”。

这意味着当你做

begin
set -l foo
end
$foo仅在该块中定义。

和类似的东西
set -l foo
begin
set -l foo
end

将创建 $foo 的第二个版本在该块内,并在该块结束后返回另一个。

所以,你需要做的是在块之外定义它,然后在里面改变它:
set -l foo
begin
set foo bar
end

IE。
function frob
set --local filename $argv[1]
echo "Before: $filename"

if not string match --regex --entire "\.fish" $filename
set filename $filename.fish
end

echo "After: $filename"
end

关于fish - 有条件地在 fish 中设置局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53684983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com