我是shell脚本的新手,试图捕获程序的返回值,并用它做一些事情。
我在下面有这个脚本
#!/bin/sh
if [ $# !=2 ] ; then
echo "Usage : param1 param2 "
exit 1;
elif [ $# -eq 2 ]; then
./callprogram
$out = $?
echo "$out"
fi
if [ $out==0 ]; then
echo "out ok"
fi
它一直让我错误
"[: 11: 0: unexpected operator
out ok
我不知道第11行是错误的。如果我删除“fi”,它将承诺它需要“fi”。有谁可以帮忙解决这个问题?
谢谢
答案 0 :(得分:3)
[
后需要一个空格,您需要使用-eq
(等于)或-ne
(不等于)来比较if语句中的数字。
分配变量使用out=$?
,而不是$out = $?
。 =
标志的任何一侧都不应有空格。
试试这个:
if [ $# -ne 2 ] ; then
echo "Usage : param1 param2 "
exit 1
elif [ $# -eq 2 ]; then
./callprogram
out=$?
echo "$out"
fi
if [ $out -eq 0 ]; then
echo "out ok"
fi
答案 1 :(得分:2)
变化:
if [ $out==0 ]; then
为:
if [ $out = 0 ]; then
添加空格,并将'=='更改为'='。注意,作为bash执行的bash接受==
。但是如果你运行的话就是“意外的操作员”。
<强>为什么:强>
[
是一个命令(或用于测试二进制文件的符号链接,具体取决于您的操作系统和shell)。它期望$out
和==
以及0
和]
是单独的命令参数。如果你错过了他们周围的空间,你有一个参数$out==0
。
<强>顺便说一句:强>
总是引用这样的变量更安全:
if [ "$var" ......
而不是
if [ $var
因为当变量为空时,由于参数数量错误(没有参数而不是空字符串),您可能会收到另一个错误。
答案 2 :(得分:1)
你有几个问题。给你错误的是你在<= p>之后需要一个空格
if [ $# != 2 ]
(虽然-ne
会比!=
好。你似乎用11个参数调用脚本,然后调用[带参数11 !=2
,并且它不知道该怎么办!= 2因为你的意思是!= 2
但忘记了空间。另外,你想要
out=$?
关于作业(LHS上没有$) 和
if [ $out = 0 ]
比较。 (运算符周围的空格,'='而不是'=='。'=='将适用于许多shell,但'='适用于更多的shell。)
但是如果没有明确引用$?
,你的脚本会写得更好#!/bin/sh if test $# != 2; then echo "Usage: $0 param1 param2 " >&2 # Errors go to stderr, not stdout exit 1; fi # you know $# is 2 here. No need to check if ./callprogram; then echo "out ok" fi