何时以及何时不与 if 一起使用 [ ] 运算符?

何时以及何时不与 if 一起使用 [ ] 运算符?
#!/bin/bash
echo 'Want Task 1'
read r1 ;
if [ echo "${r1}" | grep -iq "^y" ] ; then
    echo 'Task One Done'

    echo 'Want Task 2 ??'
    read r101
    if [ echo "${r101}" | grep -iq "^y" ] ; then 
        echo 'Task 2 Done'
    fi
fi

当我运行上面的代码时,它给我错误提示

[: 缺少 `]' grep: ]: 没有这样的文件或目录

但是当我简单地省略括号时[]代码就可以完美运行。我知道这[]是一个测试命令,但我不知道何时使用它,何时不使用它。

另外请澄清我是否应该将其称为[]“操作员”或test“命令”

旁注,如有必要,我在 GNOME 终端中使用 Bash。

答案1

使用管道可以让命令在不同的子 shell 中运行,因此您会收到错误消息,因为命令 ([grep) 都不完整(各自无法按预期工作)。

如果您只想测试程序的结果代码,则不需要使用[ … ]or test,您只需要使用这些代码进行更明确的比较,例如[ 1 -gt 2 ]or [ "$1" == "$2" ]。如果您想要更高级的比较,例如使用正则表达式,您可以使用命令[[ … ]],请参阅测试结构正则表达式简介在“高级 Bash 脚本指南”中

答案2

这是对执行相同操作的脚本的另一个建议:

#! /bin/bash
read -p 'Want Task 1 ' 
if [ "${REPLY^}" = Y ] ; then
    echo 'Task One Done'

    read -p 'Want Task 2 ?? '
    if [ "${REPLY,}" = y ] ; then 
        echo 'Task 2 Done'
    fi
fi

的默认变量read$REPLY.使用的时候${REPLY^}会得到大写的内容,使用的时候会得到${REPLY,}小写的内容。由于变量可以为空,因此您需要将"其引起来。

如果你真的想像这样调用外部程序,grep可以这样做:

read -p 'Want Task 1 ' 
if echo $REPLY | grep -icq ^y ; then
        echo 'Task 1 Done'
fi

上面实际发生的是,我们运行一个命令,如果退出值不为 0,则为 true。这个例子将展示它:

if /bin/true ; then
    echo We have always the yes hat on
fi

并且[只是一个名为 的程序/usr/bin/test。在下面查找一下man test

相关内容