Unix read -p 命令导致 bash 错误,我该如何解决?

qod*_*nja 1 bash prompt

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

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  
}
Run Code Online (Sandbox Code Playgroud)

更新 当我在提示中输入多个单词时会发生这种情况,例如,如果我输入“更新”,我不会收到错误消息...但如果我输入多个单词

enter checkin comment >> sun mars venus
Run Code Online (Sandbox Code Playgroud)

然后我得到错误(总是在第二个字上)

-bash: [: mars: binary operator expected
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 6

if [ ! $COMMENT ]
Run Code Online (Sandbox Code Playgroud)

我认为您的意思是检查是否$COMMENT为非空,但这不是该命令的作用。未加引号的变量替换会经历文件名生成(通配)和分词。在这里,您在注释 ( sun mars venus) 中输入了几个单词,因此[命令会看到! sun mars venus(4 个参数)这是无效的语法。始终在变量替换周围加上双引号:

if [ ! "$COMMENT" ]
Run Code Online (Sandbox Code Playgroud)

在这种特殊情况下,这将测试是否$COMMENT为非空。这是一个快捷方式,因为括号内只有两个 shell 词。一般情况下,测试一个字符串是否为非空的方法是使用-n运算符,-z运算符测试字符串是否为空。

if [ -z "$COMMENT" ]
Run Code Online (Sandbox Code Playgroud)

在 ksh/bash/zsh 中,您可以使用[[ … ]]构造而不是[ … ]命令。单括号是受通常的shell 语法规则约束的普通命令,而双括号是具有自己规则的特殊shell 语法。双括号内没有分词,所以你可以写

if [[ -z $COMMENT ]]
Run Code Online (Sandbox Code Playgroud)

虽然双引号不会受到伤害。

对于if [ ! $1 ]which should be if [ -z "$1" ]or 也是如此if [[ -z $1 ]]

还有一个额外的奇怪之处,COMMENT当注释作为参数传递给函数时,你将变量导出到环境中,而不是当你使用read内置函数读取它时。除非您需要传递COMMENT给外部程序,否则请删除export.