鱼壳:翻转一个布尔值

时间:2017-12-11 21:11:50

标签: fish

我疯了吗?我想翻转一个布尔变量。我想出了这个:

function toggle_light_colorscheme
  if eval $LIGHT_COLORSCHEME
    set -U LIGHT_COLORSCHEME false
  else
    set -U LIGHT_COLORSCHEME true
  end
end

鱼甚至有布尔?我怀疑不是。但它有falsetrue命令,我可以man。无论如何,我可能不需要布尔值。我想做的就是拥有一个全局变量,当设置时,这意味着我在fish和vim中使用了浅色配色方案。如果没有设置,我会使用黑暗的。必须有一个更简单的方法,我想要像:

set -U LIGHT_COLORSCHEME (not $LIGHT_COLORSCHEME)

2 个答案:

答案 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的变量已设置为01(布尔值实际上在任何低级lang中被解释的方式):

set bool (math abs\((math $bool - 1)\))

_正确跳过括号实际上是主要的挑战! fish的带括号的cmd替换样式非常方便,但是会干扰()中需要参数的函数,也许还有更好的方法……