Bash脚本错误[:!=:一元运算符预期

时间:2014-03-04 17:55:47

标签: bash

在我的脚本中,我试图错误检查第一个和唯一的参数是否等于-v但它是一个可选参数。我使用if语句,但我一直得到一元运算符预期的错误。

这是代码:

if [ $1 != -v ]; then
   echo "usage: $0 [-v]"
   exit
fi

编辑:

我应该更具体: 上面脚本的这一部分是检查一个可选参数然后,如果没有输入参数,它应该运行程序的其余部分。

#!/bin/bash

if [ "$#" -gt "1" ]; then
   echo "usage: $0 [-v]"
   exit
fi

if [ "$1" != -v ]; then
   echo "usage: $0 [-v]"
   exit
fi

if [ "$1" = -v ]; then
   echo "`ps -ef | grep -v '\['`"
else
   echo "`ps -ef | grep '\[' | grep root`"
fi

2 个答案:

答案 0 :(得分:141)

行情!

if [ "$1" != -v ]; then

否则,当$1完全为空时,您的测试将变为:

[ != -v ]

而不是

[ "" != -v ]

...而!=不是一元运算符(也就是说,只能使用一个参数)。

答案 1 :(得分:-2)

或者看似猖ramp的矫over过正,但实际上很简单……几乎涵盖了您的所有情况,没有空​​字符串或一元问题。

在第一个arg是'-v'的情况下,然后执行条件ps -ef,否则在所有其他情况下都抛出用法。

#!/bin/sh
case $1 in
  '-v') if [ "$1" = -v ]; then
         echo "`ps -ef | grep -v '\['`"
        else
         echo "`ps -ef | grep '\[' | grep root`"
        fi;;
     *) echo "usage: $0 [-v]"
        exit 1;; #It is good practice to throw a code, hence allowing $? check
esac

如果您不在乎'-v'arg的位置,则只需将大小写放在循环中即可。这将允许遍历所有args并在任何地方找到“ -v”(只要它存在)。这意味着命令行参数顺序并不重要。如前所述,如前所述,变量arg_match被设置,因此它仅仅是一个标志。它允许多次出现“ -v” arg。可以很容易地忽略所有其他出现的“ -v”。

#!/bin/sh

usage ()
 {
  echo "usage: $0 [-v]"
  exit 1
 }

unset arg_match

for arg in $*
 do
  case $arg in
    '-v') if [ "$arg" = -v ]; then
           echo "`ps -ef | grep -v '\['`"
          else
           echo "`ps -ef | grep '\[' | grep root`"
          fi
          arg_match=1;; # this is set, but could increment.
       *) ;;
  esac
done

if [ ! $arg_match ]
 then
  usage
fi

但是,在以下情况下允许多次出现参数很方便使用:

$ adduser -u:sam -s -f -u:bob -trace -verbose

我们不在乎参数的顺序,甚至允许多个-u参数。是的,允许这样做很简单:

$ adduser -u sam -s -f -u bob -trace -verbose