Unix read -p 命令导致 bash 错误,如何修复?

Unix read -p 命令导致 bash 错误,如何修复?

我正在尝试提示用户发表评论

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...

相关内容