我疯了吗?我想翻转一个布尔变量。我想出了这个:
function toggle_light_colorscheme
if eval $LIGHT_COLORSCHEME
set -U LIGHT_COLORSCHEME false
else
set -U LIGHT_COLORSCHEME true
end
end
鱼甚至有布尔?我怀疑不是。但它有false
和true
命令,我可以man
。无论如何,我可能不需要布尔值。我想做的就是拥有一个全局变量,当设置时,这意味着我在fish和vim中使用了浅色配色方案。如果没有设置,我会使用黑暗的。必须有一个更简单的方法,我想要像:
set -U LIGHT_COLORSCHEME (not $LIGHT_COLORSCHEME)
答案 0 :(得分:6)
鱼甚至有布尔?
没有。实际上它根本就没有类型,比如受它启发的POSIX shell。每个变量都是一个字符串列表。
但它有虚假和真实的命令
是。这些命令分别返回1和0。任何返回状态!= 0都被认为是错误代码,因此为false,0为真(在这方面它是C的倒数)。
我想做的就是拥有一个全局变量,当设置时,这意味着我在fish和vim中使用了浅色配色方案。如果它没有设置我正在使用黑暗的那个。
当然,这可以成功。有几种不同的方法可以解决这个问题。您可以使用变量具有元素的事实来表示它是真的,或者您使用它是例如1。
前者会像
一样工作# Check if variable is "true" by checking if it has an element
if set -q LIGHT_COLORSCHEME[1]
# ...
# Flip the variable
set -q LIGHT_COLORSCHEME[1]; and set -e LIGHT_COLORSCHEME[1]; or set LIGHT_COLORSCHEME 1
(当然你也可以做一个“翻转”功能 - 不幸的是“not”是一个关于命令返回状态而不是变量值的关键字)
后者看起来像
if test "$LIGHT_COLORSCHEME" = 1 # the "=" here tests string-equality, but that shouldn't matter.
# ...
# Flip the variable
test "$LIGHT_COLORSCHEME" = 1; and set LIGHT_COLORSCHEME 0; or set LIGHT_COLORSCHEME 1
我想出了这个:
功能toggle_light_colorscheme 如果eval $ LIGHT_COLORSCHEME
你误解了eval
的作用。它将作为代码运行。即它会尝试将LIGHT_COLORSCHEME 的值作为命令执行。所以,如果你在$ PATH中的某个地方有一个名为“1”的命令,它就会运行它!
要测试条件,请使用test
。
答案 1 :(得分:0)
2.5年后,我正在寻找“在鱼中翻转(伪)布尔变量”并降落在这里! StackOverflow也许是所有(开发人员)最大的书面历史记录……
顺便说一句。我借助内置数学函数轻松解决了这个问题!
假设名为bool
的变量已设置为0
或1
(布尔值实际上在任何低级lang中被解释的方式):
set bool (math abs\((math $bool - 1)\))
_正确跳过括号实际上是主要的挑战! fish的带括号的cmd替换样式非常方便,但是会干扰()
中需要参数的函数,也许还有更好的方法……