【问题标题】:bash if empty stringbash 如果为空字符串
【发布时间】:2012-09-17 23:19:46
【问题描述】:

有些人可能在 Ubuntu 中通过终端安装或更新时发现了这一点

你会收到类似的问题

“您是否安装或删除软件包 [Y/n]?”

当你按下回车时,它就像你输入“Y”或“y”时一样

所以我想知道如何在 bash 中制作它 这就是我目前所拥有的?

echo "question?[Y/n]"
read choose
if [ $choose ~= "Y" ] [ $choose ~= "y" ] [ $choose ~= "" ]
then 
#code
fi

【问题讨论】:

    标签: bash if-statement


    【解决方案1】:

    传统上(意味着它可以在 bash 以外的 POSIX-ish shell 中工作),你会写:

    echo "Question? [Y/n]"
    read choose
    if [ "$choose" = "Y" ] || [ "$choose" = "y" ] || [ -z "$choose" ]
    then 
        # code
    fi
    

    即使$choose 是空字符串,引号也能确保测试操作员看到参数。

    [[ 运算符似乎允许您在不引用字符串的情况下逃脱,但它不是 POSIX shell 的一部分。 POSIX 通过以下方式承认其存在:

    以下单词在某些实现中可能被识别为保留字(当没有引用任何字符时),导致未指定的结果:

    [[    ]]    function    select
    

    如果您希望 shell 将光标留在提示符所在的同一行,您可以使用:

    printf "Question? [Y/n] "
    

    POSIX shell 识别\c 转义; bash 没有:

    echo "Question? [Y/n] \c"
    

    (可能有办法让bash 处理这个问题,但printf 可能更便携。)

    【讨论】:

    • +1 用于 printf 建议。与 echo (个人意见)相比,它非常整洁 :) “echo -n” 会打印消息并将光标留在同一行,例如echo -n "问题?[Y/n]"
    • @AshishKumar:谢谢。我记得bash 在我发布答案后使用echo -n 遵循Unix 7th Edition Bourne shell,而不是使用\c 的System III、System V 逃逸风格。有关echo 命令样式的讨论,请参阅Bloated echo command
    【解决方案2】:
    echo -n "Question? [Y/n]"
    read choose 
    shopt -s nocasematch
    if [[ "${choose:=Y}" =~ Y ]]; then
         # they said yes
    else
         # they said something else
    fi
    

    这种方法可能具有的优势是,如果您稍后检查它,它会将$choose 设置为 Y。如果您希望稍后能够知道他们是输入了Y 还是只是按下了回车键,您可以改用${choose:-Y}

    如果您不想设置nocasematch,您可以随时明确检查Yy。或者,如果您喜欢nocasematch 解决方案但关心保留标志的状态,您可以检查并恢复它:

    shopt -q nocasematch
    let not_set=$?
    shopt -s nocasematch
    

    ...

    if (( not_set )); then
       shopt -u nocasematch
    fi
    

    【讨论】:

    • 您可以使用 declare -u choose; read choose 代替 nocasematch。在扩展中使用默认值的调用很好。
    • 是的,但 declare -u 是 bash-4-ism,这不是通用的(例如,Lion 仍然有 bash 3;不确定 Mountain Lion)。 IMO,自 1983 年 ksh 排版 -L 和 -U 以来花了这么长时间,这很愚蠢,但你去吧。 :)
    【解决方案3】:

    test(1)

    [ "$choose" = "Y" -o "$choose" = "y" -o "$choose" = "" ]
    

    必须将变量放在双引号之间,否则表达式会产生一个空变量的错误,因为它们各自的左边都是空的。

    【讨论】:

      【解决方案4】:

      "read" 读取输入直到进入。因此,如果您只想接受“输入”作为答案,请尝试使用“”答案。您可以使用 [[ ]] 代替“test”命令来检查字符串( man test )

      dtpwmbp:~ pwadas$ [[ -z "" ]] && echo yes 
      yes
      dtpwmbp:~ pwadas$ [[ -z "ABCD" ]] && echo yes 
      dtpwmbp:~ pwadas$ 
      

      这里,测试字符串的长度为零。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-12
        • 2020-10-03
        • 2016-05-19
        • 2011-11-04
        • 2012-08-09
        • 2013-05-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多