简单条件在bash中得到错误的评估结果[重复]
Posted
技术标签:
【中文标题】简单条件在bash中得到错误的评估结果[重复]【英文标题】:Simple condition getting wrong evaluation result in bash [duplicate] 【发布时间】:2021-08-13 03:00:56 【问题描述】:我有这个 bash 脚本获取布尔参数,基于 answer here 我创建了这个简单的条件,由于某种原因,我得到了错误的结果
#!/bin/bash
copyFile()
echo "copyFile #Parameter:$1"
if [ "$1" ]; then
echo "Parameter is true"
else
echo "Parameter is false"
fi
copyFile true
copyFile false
执行结果:
[admin@local_ip_tmp]$ ./test.sh
copyFile #Parameter:true
Parameter is true
copyFile #Parameter:false
Parameter is true
最后的结果应该是“参数为假”我不知道发生了什么。 做错了什么?
【问题讨论】:
提示:false
只是一个字符串,它不是空的
准确测试您想要测试的内容。您当前的测试等效于if [ -n "$1" ]
(如果$1
不为空)。你追求什么? if [ "$1" = "true" ]
或 if [ "$1" != "true" ]
或 if [ "$1" = "false" ]
或 ...
删除[
和]
。
@JavaSheriff,我个人建议使用带有整数常量的算术测试上下文。 if (( $1 )); then ...
将 0
视为 false,所有正整数都视为 true。
@JavaSheriff,你是什么意思?在我之前的评论中,那 是 一个例子。除了用then
块的实际内容替换...
之外,它不需要更改,只要您的$1
是0
为false 和1
为true。
【参考方案1】:
linked post 上的accepted answer 以:
bash 不知道布尔变量,也不知道测试
因此,如 cmets 中所述[1][2]if [ "$1" ];
被评估为 if [ -n "$1" ]
,并且由于 $1
不为空,"Parameter is true"
将被打印。
要测试是否给出了字符串"true"
,可以使用以下代码
#!/bin/bash
copyFile()
echo "copyFile #Parameter:$1"
if [ "$1" = "true" ]; then
echo "Parameter is true"
else
echo "Parameter is false"
fi
copyFile "true"
copyFile "false"
这将产生:
copyFile #Parameter:true
Parameter is true
copyFile #Parameter:false
Parameter is false
你可以测试on this online demo。
【讨论】:
==
应该是 =
。因为它适用于 bash 本身,但不适用于基线 POSIX shell。请参阅the POSIX standard for test
,它根本没有指定==
。以上是关于简单条件在bash中得到错误的评估结果[重复]的主要内容,如果未能解决你的问题,请参考以下文章