我正在尝试提示用户发表评论
function comment {
if [ ! $1 ]
then
read -p "enter checkin comment < " COMMENT;
else
export COMMENT="$1"
fi
if [ ! $COMMENT ]
then
echo 'no comment!'
else
echo "$COMMENT";
fi
}
更新 当我在提示中输入多个单词时,会发生这种情况,例如,如果我输入“更新”,我不会收到错误消息...但如果我输入多个单词
enter checkin comment >> sun mars venus
然后我收到错误(总是在第二个词上)
-bash: [: mars: binary operator expected
答案1
if [ ! $COMMENT ]
我认为你的意思是检查是否$COMMENT
非空,但这不是这个命令的作用。不带引号的变量替换会经历文件名生成(通配符)和分词。在这里,您在注释 ( sun mars venus
) 中输入了几个单词,因此[
命令会看到! sun mars venus
(4 个参数),这不是有效的语法。始终在变量替换两边加上双引号:
if [ ! "$COMMENT" ]
在这种特殊情况下,这测试是否$COMMENT
为非空。这是一个快捷方式,因为括号内只有两个 shell 单词。一般情况下,测试字符串是否非空的方法是使用-n
运算符,-z
运算符测试字符串是否为空。
if [ -z "$COMMENT" ]
在 ksh/bash/zsh 中,您可以使用[[ … ]]
构造而不是[ … ]
命令。单括号是受通常 shell 语法规则约束的普通命令,而双括号是具有自己规则的特殊 shell 语法。双括号内没有分词,所以你可以写
if [[ -z $COMMENT ]]
双引号不会有什么坏处。
这同样适用于if [ ! $1 ]
应该是if [ -z "$1" ]
或 的情况if [[ -z $1 ]]
。
还有一个奇怪的地方是,COMMENT
当注释作为参数传递给函数时,您将变量导出到环境中,但当您使用read
内置函数读取它时,则不会。除非您需要传递COMMENT
给外部程序,否则请删除单词export
.
答案2
Bash 将 解释[
为test
命令(参数周围需要空格)。看Greg 关于测试和条件的 Wiki...