在我的脚本中,我试图错误检查第一个和唯一的参数是否等于-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
答案 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