我正在尝试提示用户发表评论
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)
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.
| 归档时间: |
|
| 查看次数: |
896 次 |
| 最近记录: |