我试图在 bash 脚本 if 语句中使用 tput 命令,但由于某种原因它的行为异常。当运行命令然后仅在 if 语句中检查退出代码时,一切正常,但是,当直接在 if 语句中运行命令时,一切不再工作。这是一个简单的脚本来说明我的问题:
#!/bin/bash
tput setaf 1
if [ $? ]
then
echo "first if works"
fi
if tput setaf 1
then
echo "second if works"
fi
运行此脚本仅打印“first if Works”。这两个 if 语句不应该工作吗,因为它们是等效的?我错过了什么吗?顺便说一句,如果重要的话,它正在 FreeBSD 上运行。
答案1
这些陈述并不等同。
首先正在检查是否$?
是非空字符串;它永远都会如此,所以第一个的身体if
将永远运行。[
string
]
是
如果字符串为真细绳不是空字符串;否则为假。
第二正在检查是否tput setaf 1
成功,或者检查其退出状态(因此$?
)是否为零。仅当命令成功时,第二个函数的主体if
才会运行。tput
它大致相当于
tput setaf 1
if [ $? -eq 0 ]
...
您描述的结果表明tput setaf 1
正在退出并带有一些非零代码(例如 1)。 " 1
" 是一个非空字符串,但它不为零。tput setaf 1 ; echo $?
会告诉你实际的代码是什么,然后你可以进一步调查。