关于bash脚本命令行参数完全混淆

时间:2014-02-10 09:07:23

标签: linux bash shell hadoop command-line-arguments

我有以下bash脚本文件callee.sh,它是从另一个脚本文件caller.sh调用的。

callee.sh如下:

if [ $1 -eq  1 ];
then    
    echo  inside $1
    source ~/MYPROGRAMSRC/standAloneWordCount.sh $2
    #echo "inside standalone branch"
    #echo $1

elif [  $1 -eq  2  ];
then
    #echo "inside distributed branch"
    #echo $1

else
    echo invalid option for first argument-\n Options:\n "distributed"\n or\n "standalone"\n 


fi  

正如大多数人可能会说的那样,这是一个脚本,用于决定是否以分布式或独立模式运行hadoop,具体取决于参数。

此脚本从caller.sh调用,如下所示

source callee.sh $2 $counterGlobal

其中$ 2是1或2的数字,$ counterGlobal是某个整数。

我的问题是callee.sh中的if条件永远不会计算为True,因此我从来没有调用我在callee.sh中调用的脚本standAloneWordCount.sh。我正在使用bash shell运行并尝试了许多if语句的变体,如:

if [ $(($1 == 1 )) ]  -- (1)

在行 - (1)之上的echo语句中,表达式$(($ 1 == 1))的计算结果为1,所以我感到困惑的是为什么我无法满足if条件。

此外,我一直收到错误信息:

syntax error near unexpected token `else'

如果有人能帮我解决这两个错误,我们将不胜感激。因为我已经没有想法了。

提前致谢!

2 个答案:

答案 0 :(得分:1)

  

尝试了if语句的许多变体,如:

     

if [ $(($1 == 1 )) ]

你应该说:

if (($1 == 1)); then
  ...
fi

关于Syntax error near unexpected token else',这不是因为您在上面显示的任何代码。它似乎源自您脚本的其他部分。

答案 1 :(得分:0)

如果您正在使用bash,请尝试使用双方括号:

if [[ $1 -eq 1 ]]; then
    echo "inside 1"
fi

对于syntax error,您需要在文本周围添加引号(这也意味着转义现有引号或使用单引号):

echo -e "invalid option for first argument-\n Options:\n \"distributed\"\n or\n \"standalone\"\n"

-e标记是为了让bash知道您希望\n评估为换行符。