首页 > 解决方案 > 空白扩展测试`[[]]`不起作用

问题描述

test例如,我可以在算术扩展中和中((...))使用空白来表示 NULL

$ test ; echo $?
1
$ (( )); echo $?
1

但是使用扩展的测试命令,我得到一个错误,

$ [[ ]]; echo $?
bash: syntax error near `;'

好的,我可以使用''or来修复这个错误"",但我的问题是

  1. 无论如何我可以使用空白测试[[ ]]而不会出错?
  2. 如果 1. 的答案是“否”,那么我想知道为什么行为与and[[ ]]不同的原因?[ ](( ))

标签: bashboolean-expression

解决方案


对于您的第一个问题,为什么只有[[ ]]在我阅读手册页时才不起作用,因为BASH我看到以下内容:

[[…]] [[ expression ]] 根据条件表达式表达式的评估返回状态 0 或 1。表达式由以下 Bash 条件表达式中描述的基元组成。[[和]]之间的单词不进行分词和文件名扩展;执行波浪号扩展、参数和变量扩展、算术扩展、命令替换、进程替换和引号删除。诸如“-f”之类的条件运算符必须不加引号才能被识别为主要运算符。

这意味着它不应该为空。

[对于您的第二个问题,这里的增强和增强之间[[的区别非常有用,所以我发现您也可以通过它。[[[

Bash 中的 [ 和 [[ 有什么区别?

编辑:为了检查最后一个命令的状态,我创建了一个简单的检查,您也可以将其作为开始:

if [[ $? -eq 0 ]]
then
  echo "Last command ran successfully."
else
  echo "Last command status is NOT 0 so could be it did not run properly."
fi

EDIT2:((根据OP在评论中的问题添加示例的使用示例((

cat script.ksh
echo "Please enter a value:"
read value
if ! ((value % 4)); then
    echo "$value is fully divided from 4."
fi

((来自man BASH

((expression)) 表达式根据以下算术评估中描述的规则进行评估。如果表达式的值非零,则返回状态为 0;否则返回状态为 1。这完全等同于 let "表达式"。


推荐阅读