为什么我的if语句在switch语句中总是评估为false?

时间:2018-12-04 21:26:52

标签: bash if-statement switch-statement

我的if语句在switch语句中始终评估为false。我尝试使用布尔变量,现在只使用数字,得到的结果相同。 if语句不起作用。

#!/bin/bash

hidden=1

while true; do

    read -sn 1 input

    case $input in
        q ) 
                ;;
        n )     
                ;;
        h )     if ! [ $hidden ]; then  # hide video
                    echo "hidden (false): $hidden"
                    hidden=1
                else    # show video
                    echo "hidden (true): $hidden"
                    hidden=0
                fi
                ;;
        '' )    ;;
        \? );;  
    esac

done
exit 0

如果我运行它并按几次“ h”,我会得到..

hidden (true): 1
hidden (true): 0
hidden (true): 0
hidden (true): 0

为什么我的if语句总是评估为false?

1 个答案:

答案 0 :(得分:2)

dependencies { compile "io.micronaut.configuration:micronaut-kafka" compile "io.micronaut.configuration:micronaut-hibernate-validator" compile("io.micronaut.configuration:micronaut-hibernate-gorm") { exclude group: 'org.grails', module: 'grails-datastore-gorm-hibernate5' } compile "org.grails:grails-datastore-gorm-hibernate5:6.1.9.RELEASE" compile "io.micronaut:micronaut-http-client" compile "io.micronaut:micronaut-http-server-netty" compile "io.micronaut:micronaut-runtime-groovy" compile "io.micronaut:micronaut-validation" compileOnly "io.micronaut:micronaut-inject-groovy" runtime "ch.qos.logback:logback-classic:1.2.3" runtime "org.apache.tomcat:tomcat-jdbc" runtime "mysql:mysql-connector-java:6.0.6" testCompile "io.micronaut:micronaut-inject-groovy" testCompile("org.spockframework:spock-core") { exclude group: "org.codehaus.groovy", module: "groovy-all" } compile files('src/main/resources/libs/my-domain-lib.jar') } 等效于[ $hidden ],并检查[ -n $hidden ]是否扩展为非空字符串; $hidden0都是非空字符串,且结果均为true,因此1为false。

侧面说明:如果! [ $hidden ]实际上是一个空字符串,则会出现语法错误;为了防止这种情况,请像这样引用:

$hidden

要执行我认为想要的操作,必须使用其他conditional construct

if ! [ "$hidden" ]; then

这会在arithmetic context中计算if ! (( hidden )); then ;值hidden被认为是假的,非零是真。在算术上下文中,可以跳过0,因此可以跳过$而不是hidden。也不需要报价。注意$hidden是Bash扩展;如果要在POSIX sh中使用相同的功能,则必须使用

(( ))