有条件地在鱼中设置局部变量
conditionally set local variable in fish
我仔细阅读了 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" 函数只是在 "Before" 和 "After" 中打印相同的内容。
我能想到的唯一解决方法是使用临时全局变量,并在函数结束时手动删除它。
示例:
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
但是,此方法存在一些问题。首先,我想检查是否可能与预先存在的全局变量发生冲突,并保存任何现有值以在我的脚本退出时恢复。
不幸的是,如果我的脚本由于错误而意外结束,可能永远不会执行 "cleanup" 代码。
我是否缺少解决此问题的更好方法?
"local" 有点用词不当。这是 "block-scoped".
这意味着当你这样做时
begin
set -l foo
end
$foo
仅在该块中定义。
还有类似的东西
set -l foo
begin
set -l foo
end
将在该块内创建 $foo
的第二个版本,并在块结束后 return 到另一个版本。
因此,您需要做的是在块外定义它,然后在块内更改它:
set -l foo
begin
set foo bar
end
即
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 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" 函数只是在 "Before" 和 "After" 中打印相同的内容。
我能想到的唯一解决方法是使用临时全局变量,并在函数结束时手动删除它。
示例:
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
但是,此方法存在一些问题。首先,我想检查是否可能与预先存在的全局变量发生冲突,并保存任何现有值以在我的脚本退出时恢复。
不幸的是,如果我的脚本由于错误而意外结束,可能永远不会执行 "cleanup" 代码。
我是否缺少解决此问题的更好方法?
"local" 有点用词不当。这是 "block-scoped".
这意味着当你这样做时
begin
set -l foo
end
$foo
仅在该块中定义。
还有类似的东西
set -l foo
begin
set -l foo
end
将在该块内创建 $foo
的第二个版本,并在块结束后 return 到另一个版本。
因此,您需要做的是在块外定义它,然后在块内更改它:
set -l foo
begin
set foo bar
end
即
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