bash - 空白扩展测试`[[]]`不起作用
问题描述
test
例如,我可以在算术扩展中和中((...))
使用空白来表示 NULL
$ test ; echo $?
1
$ (( )); echo $?
1
但是使用扩展的测试命令,我得到一个错误,
$ [[ ]]; echo $?
bash: syntax error near `;'
好的,我可以使用''
or来修复这个错误""
,但我的问题是
- 无论如何我可以使用空白测试
[[ ]]
而不会出错? - 如果 1. 的答案是“否”,那么我想知道为什么行为与and
[[ ]]
不同的原因?[ ]
(( ))
解决方案
对于您的第一个问题,为什么只有[[ ]]
在我阅读手册页时才不起作用,因为BASH
我看到以下内容:
[[…]] [[ expression ]] 根据条件表达式表达式的评估返回状态 0 或 1。表达式由以下 Bash 条件表达式中描述的基元组成。[[和]]之间的单词不进行分词和文件名扩展;执行波浪号扩展、参数和变量扩展、算术扩展、命令替换、进程替换和引号删除。诸如“-f”之类的条件运算符必须不加引号才能被识别为主要运算符。
这意味着它不应该为空。
[
对于您的第二个问题,这里的增强和增强之间[[
的区别非常有用,所以我发现您也可以通过它。[[
[
编辑:为了检查最后一个命令的状态,我创建了一个简单的检查,您也可以将其作为开始:
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 "表达式"。
推荐阅读
- c# - 使用依赖注入的通用接口解析具体类是一个好的设计吗?
- java - 如何使用java复制现有列数据并在另一列中编辑它
- spring-batch - Spring Batch:使用不同的参数执行相同的作业
- c# - 枚举一个类的所有实例
- javascript - 滚动后删除动画
- reactjs - 为什么在 React Native 中我的页面转换之前会有一个白色的“加载屏幕”?
- java - Springboot 批处理 Tasklet 验证
- reactjs - 阿波罗客户端 onSubscriptionData 不工作
- xamarin.forms - Intune MAM SDK:如何在 iOS 和 Android 中获取用户 ID?
- javascript - 用于下一页的 Javascript/jQuery 安全选定项